如何在 android 中批量插入 sqlite
how to bulk insert in sqlite in android
我正在使用 SQLiteOpenHelper 进行数据插入。我需要插入 2500 个 id 和 2500 个名字,所以太花时间了。请任何人帮助我如何减少插入时间。我们可以一次插入多条记录吗?任何人帮助我。先感谢您。
代码:
public class DatabaseHandler extends SQLiteOpenHelper {
SQLiteDatabase db;
private static final int DATABASE_VERSION = 8;
private static final String TABLE_CITY = "CITYDETAILS";
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.mContext = context;
}
public void onCreate(SQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_CITY );
String CREATE_CITY_TABLE = "CREATE TABLE " + TABLE_CITY + "("
+ CityId + " INTEGER," + CityName + " TEXT " + ")";
db.execSQL(CREATE_CITY_TABLE);
db.execSQL(CREATE_RechargeTypes_TABLE);
this.db=db;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
// Create tables again
onCreate(db);
}
public void add_city(String cityid,String cityname){
SQLiteDatabase db = this.getWritableDatabase();
db.beginTransaction();
ContentValues values = new ContentValues();
values.put(CityId, cityid);
values.put(CityName, cityname);
db.insert(TABLE_CITY, null, values);
db.insertWithOnConflict(TABLE_CITY, null, values, SQLiteDatabase.CONFLICT_IGNORE);
db.setTransactionSuccessful();
db.endTransaction();
}
}
activity 课程:
try{
String Status = result.get("Status").getAsString();
if (TextUtils.equals(Status, "true")) {
Gson gson = new Gson();
JsonArray array = result.get("data")
.getAsJsonArray();
Type type = new TypeToken<ArrayList<Cities>>() {
}.getType();
setmCities((ArrayList<Cities>) gson.fromJson(array, type));
for(int i=0;i< array.size();i++) {
db.add_city(mCities.get(i).getCityid(),mCities.get(i).getCityname());
}
}
使用事务插入所有行 -- 不是每个事务插入一行。
SQLiteDatabase db = ...
db.beginTransaction();
try {
// do ALL your inserts here
db.setTransactionSuccessful()
} finally {
db.endTransaction();
}
编辑
public void add_cities(List<Cities> list) {
SQLiteDatabase db = this.getWritableDatabase();
db.beginTransaction();
try {
ContentValues values = new ContentValues();
for (Cities city : list) {
values.put(CityId, city.getCityid());
values.put(CityName, city.getCityName());
db.insert(TABLE_CITY, null, values);
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
所有插入,一个事务。
将您的查询放在 string.xml 中的字符串数组中,使用资源处理程序在代码中打开它们并循环执行它们。在循环之前使用 beginTransaction() 和 entTransaction() 方法在失败的情况下回滚更改。
谢谢@karakuri。
我将城市 ID 和城市名称列表传递给 add_city 函数并遍历该列表并插入所有数据。由此我们可以在很短的时间内将数据插入数据库。
数据库class:
public void add_cities(ArrayList<Cities> list) {
SQLiteDatabase db = this.getWritableDatabase();
db.beginTransaction();
try {
ContentValues values = new ContentValues();
for (Cities city : list) {
values.put(CityId, city.getCityid());
values.put(CityName, city.getCityname());
db.insert(TABLE_CITY, null, values);
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
数据class:
public class Cities {
public String getCityid() {
return cityid;
}
public void setCityid(String cityid) {
this.cityid = cityid;
}
public String getCityname() {
return cityname;
}
public void setCityname(String cityname) {
this.cityname = cityname;
}
@Expose
private String cityid="0";
@Expose
private String cityname="";
public Cities(){
}
}
activity class:
ArrayList<Cities> mCities;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
db = new DatabaseHandler(getApplicationContext());
executeCircleAndOperatorsList();
}
void executeCircleAndOperatorsList() {
db.ClearTables();
ServiceClient serviceClient = ServiceUtil.getServiceClient();
JsonParser jsonParser = new JsonParser();
mCitiesCallback = new CancelableCallback(citiescallback);
serviceClient.getCities("getCities_v1", mCitiesCallback);
}
Callback<JsonObject> citiescallback=new Callback<JsonObject>() {
@Override
public void success(final JsonObject jsonObject, Response response) {
Thread t=new Thread(new Runnable() {
@Override
public void run() {
parsecities(jsonObject);
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "msg msg", Toast.LENGTH_SHORT).show();
Intent intent=new Intent(SplashActivity.this,LoginAcivtiy.class);
startActivity(intent);
}
});
}
});
t.start();
}
@Override
public void failure(RetrofitError error) {
}
};
public void parsecities(JsonObject result) {
//Log.v("TAG_RESULT", "" +result.toString());
try{
String Status = result.get("Status").getAsString();
if (TextUtils.equals(Status, "true")) {
Gson gson = new Gson();
JsonArray array = result.get("data")
.getAsJsonArray();
Type type = new TypeToken<ArrayList<Cities>>() {
}.getType();
setmCities((ArrayList<Cities>) gson.fromJson(array, type));
long start = System.currentTimeMillis();
db.add_cities(mCities);
System.out.println(System.currentTimeMillis() - start);
circle_list=db.get_cities();
Log.v("TAG_CIRCLELIST",""+circle_list);
}
else if (TextUtils.equals("Status", "false")) {
// showToast(operators.getMessage());
} else {
throw new JSONException("Something went wrong ");
} }catch(Exception e){
e.printStackTrace();
}
}
public void setmCities(ArrayList<Cities> mCities) {
this.mCities = mCities;
}
}
试试 SQLiteStatement
比 beginTransaction()
快 2-3 倍
public void add_cities(ArrayList<Cities> list) {
SQLiteDatabase database = this.getWritableDatabase();
String sql = "INSERT INTO " + TABLE_NAME + " VALUES(?, ?)";
SQLiteStatement statement = database.compileStatement(sql);
database.beginTransaction();
try {
for (Cities c : list) {
statement.clearBindings();
statement.bindLong(1, c.getCityId());
statement.bindLong(2, c.getCityName());
statement.execute();
}
database.setTransactionSuccessful();
} finally {
database.endTransaction();
}
}
这个答案来晚了,但我可以帮助其他人以简单的方式插入许多行
有一种方法可以插入多行
让我们创建我们想要插入的值(根据您的值添加一个循环)
public String getMultiInsertValues(){
StringBuilder valueToInsert = new StringBuilder()
//start loop
valueToInsert.append("(")
valueToInsert.append(id)
valueToInsert.append("),")
valueToInsert.append("(")
valueToInsert.append(name)
valueToInsert.append("),")
//end of the loop
valueToInsert.deleteCharAt(valueToInsert.lastIndexOf(","))
valueToInsert.append(";")
return valueToInsert.toString()
}
然后我们将这个值加到sql
String sql = "INSERT INTO " + tableName + " ( id ) VALUES \n" + valueToInsert
//value to Insert from the last function
最后我们应该执行这个sql
SQLiteDatabase db = getWritableDatabase();
db.execSQL(sql);
注意 sqlite 中有最大变量和条款条件你应该将你的值除以 500 并使用上述解决方案插入每个 500,因为会有多个 sql 查询 i建议您像其他答案中提到的那样使用 beginTransaction
我正在使用 SQLiteOpenHelper 进行数据插入。我需要插入 2500 个 id 和 2500 个名字,所以太花时间了。请任何人帮助我如何减少插入时间。我们可以一次插入多条记录吗?任何人帮助我。先感谢您。 代码:
public class DatabaseHandler extends SQLiteOpenHelper {
SQLiteDatabase db;
private static final int DATABASE_VERSION = 8;
private static final String TABLE_CITY = "CITYDETAILS";
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.mContext = context;
}
public void onCreate(SQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_CITY );
String CREATE_CITY_TABLE = "CREATE TABLE " + TABLE_CITY + "("
+ CityId + " INTEGER," + CityName + " TEXT " + ")";
db.execSQL(CREATE_CITY_TABLE);
db.execSQL(CREATE_RechargeTypes_TABLE);
this.db=db;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
// Create tables again
onCreate(db);
}
public void add_city(String cityid,String cityname){
SQLiteDatabase db = this.getWritableDatabase();
db.beginTransaction();
ContentValues values = new ContentValues();
values.put(CityId, cityid);
values.put(CityName, cityname);
db.insert(TABLE_CITY, null, values);
db.insertWithOnConflict(TABLE_CITY, null, values, SQLiteDatabase.CONFLICT_IGNORE);
db.setTransactionSuccessful();
db.endTransaction();
}
}
activity 课程:
try{
String Status = result.get("Status").getAsString();
if (TextUtils.equals(Status, "true")) {
Gson gson = new Gson();
JsonArray array = result.get("data")
.getAsJsonArray();
Type type = new TypeToken<ArrayList<Cities>>() {
}.getType();
setmCities((ArrayList<Cities>) gson.fromJson(array, type));
for(int i=0;i< array.size();i++) {
db.add_city(mCities.get(i).getCityid(),mCities.get(i).getCityname());
}
}
使用事务插入所有行 -- 不是每个事务插入一行。
SQLiteDatabase db = ...
db.beginTransaction();
try {
// do ALL your inserts here
db.setTransactionSuccessful()
} finally {
db.endTransaction();
}
编辑
public void add_cities(List<Cities> list) {
SQLiteDatabase db = this.getWritableDatabase();
db.beginTransaction();
try {
ContentValues values = new ContentValues();
for (Cities city : list) {
values.put(CityId, city.getCityid());
values.put(CityName, city.getCityName());
db.insert(TABLE_CITY, null, values);
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
所有插入,一个事务。
将您的查询放在 string.xml 中的字符串数组中,使用资源处理程序在代码中打开它们并循环执行它们。在循环之前使用 beginTransaction() 和 entTransaction() 方法在失败的情况下回滚更改。
谢谢@karakuri。 我将城市 ID 和城市名称列表传递给 add_city 函数并遍历该列表并插入所有数据。由此我们可以在很短的时间内将数据插入数据库。
数据库class:
public void add_cities(ArrayList<Cities> list) {
SQLiteDatabase db = this.getWritableDatabase();
db.beginTransaction();
try {
ContentValues values = new ContentValues();
for (Cities city : list) {
values.put(CityId, city.getCityid());
values.put(CityName, city.getCityname());
db.insert(TABLE_CITY, null, values);
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
数据class:
public class Cities {
public String getCityid() {
return cityid;
}
public void setCityid(String cityid) {
this.cityid = cityid;
}
public String getCityname() {
return cityname;
}
public void setCityname(String cityname) {
this.cityname = cityname;
}
@Expose
private String cityid="0";
@Expose
private String cityname="";
public Cities(){
}
}
activity class:
ArrayList<Cities> mCities;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
db = new DatabaseHandler(getApplicationContext());
executeCircleAndOperatorsList();
}
void executeCircleAndOperatorsList() {
db.ClearTables();
ServiceClient serviceClient = ServiceUtil.getServiceClient();
JsonParser jsonParser = new JsonParser();
mCitiesCallback = new CancelableCallback(citiescallback);
serviceClient.getCities("getCities_v1", mCitiesCallback);
}
Callback<JsonObject> citiescallback=new Callback<JsonObject>() {
@Override
public void success(final JsonObject jsonObject, Response response) {
Thread t=new Thread(new Runnable() {
@Override
public void run() {
parsecities(jsonObject);
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "msg msg", Toast.LENGTH_SHORT).show();
Intent intent=new Intent(SplashActivity.this,LoginAcivtiy.class);
startActivity(intent);
}
});
}
});
t.start();
}
@Override
public void failure(RetrofitError error) {
}
};
public void parsecities(JsonObject result) {
//Log.v("TAG_RESULT", "" +result.toString());
try{
String Status = result.get("Status").getAsString();
if (TextUtils.equals(Status, "true")) {
Gson gson = new Gson();
JsonArray array = result.get("data")
.getAsJsonArray();
Type type = new TypeToken<ArrayList<Cities>>() {
}.getType();
setmCities((ArrayList<Cities>) gson.fromJson(array, type));
long start = System.currentTimeMillis();
db.add_cities(mCities);
System.out.println(System.currentTimeMillis() - start);
circle_list=db.get_cities();
Log.v("TAG_CIRCLELIST",""+circle_list);
}
else if (TextUtils.equals("Status", "false")) {
// showToast(operators.getMessage());
} else {
throw new JSONException("Something went wrong ");
} }catch(Exception e){
e.printStackTrace();
}
}
public void setmCities(ArrayList<Cities> mCities) {
this.mCities = mCities;
}
}
试试 SQLiteStatement
比 beginTransaction()
public void add_cities(ArrayList<Cities> list) {
SQLiteDatabase database = this.getWritableDatabase();
String sql = "INSERT INTO " + TABLE_NAME + " VALUES(?, ?)";
SQLiteStatement statement = database.compileStatement(sql);
database.beginTransaction();
try {
for (Cities c : list) {
statement.clearBindings();
statement.bindLong(1, c.getCityId());
statement.bindLong(2, c.getCityName());
statement.execute();
}
database.setTransactionSuccessful();
} finally {
database.endTransaction();
}
}
这个答案来晚了,但我可以帮助其他人以简单的方式插入许多行 有一种方法可以插入多行 让我们创建我们想要插入的值(根据您的值添加一个循环)
public String getMultiInsertValues(){
StringBuilder valueToInsert = new StringBuilder()
//start loop
valueToInsert.append("(")
valueToInsert.append(id)
valueToInsert.append("),")
valueToInsert.append("(")
valueToInsert.append(name)
valueToInsert.append("),")
//end of the loop
valueToInsert.deleteCharAt(valueToInsert.lastIndexOf(","))
valueToInsert.append(";")
return valueToInsert.toString()
}
然后我们将这个值加到sql
String sql = "INSERT INTO " + tableName + " ( id ) VALUES \n" + valueToInsert
//value to Insert from the last function
最后我们应该执行这个sql
SQLiteDatabase db = getWritableDatabase();
db.execSQL(sql);
beginTransaction