我有一个SQLite数据库,其中的某些表包含数千行。我使用GreenDAO来管理此数据库(但它可能是另一个ORM)。
在数据库中添加大量数据的最佳方法是什么?
1-使用ORM的常规方法处理成千上万的此类行吗? (在此示例中为GreenDAO)
daoSession.getDefinitionDao().insert(new Definition(null,4L,"ail"));
这可能很杂乱,并且在执行过程中出现代码太大的错误。
2-使用资产文件夹中已填充的数据库?
使用类似于以下方法将已填充的数据库从资产文件夹复制到应用程序的数据文件夹:
/**
* Copy existing database file in system
*/
public void copyDataBase() {
int length;
byte[] buffer = new byte[1024];
String databasePath = DB_PATH + DB_NAME;
try {
InputStream databaseInputFile = this.context.getAssets().open(DB_NAME+".sqlite");
OutputStream databaseOutputFile = new FileOutputStream(databasePath);
while ((length = databaseInputFile.read(buffer)) > 0) {
databaseOutputFile.write(buffer, 0, length);
databaseOutputFile.flush();
}
databaseInputFile.close();
databaseOutputFile.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
3-使用从包含我所有插入内容的纯SQL脚本的文件中获取的原始查询吗?
SQLiteDatabase.execSQL(MY_RAW_SQL_INSERT_QUERY)
4-还有其他方法吗?
最佳答案
我在下面的代码中使用sqlite use在几秒钟内插入了数千条记录。
这是创建表查询:
private static final String CREATE_MY_TABLE = "CREATE TABLE IF NOT EXISTS " + MY_TABLE_NAME
+ " (" + UID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ LICENSE_NUMBER + " VARCHAR(255), "
+ MODEL_NUMBER + " VARCHAR(255), "
+ " UNIQUE (" + LICENSE_NUMBER + "));”;
注意:在上面的查询LICENSE_NUMBER是UNIQUE中,该查询自动管理您不需要担心的插入/更新。
在这里我正在从sdcard读取json格式的文件并将其插入
sqlite:
public boolean insertUpdateBulk() {
boolean flag = false;
SQLiteDatabase sqLiteDatabase = databaseHelper.getWritableDatabase();
try {
File sdCardDirectory = AppUtils.getDataFileDirectoryPath(mContextDatabaseAdapter);
String jsonPanelData = loadJSONFromSDCard(sdCardDirectory, MYFILENAME.json);
if (jsonPanelData != null) {
JSONArray ja = new JSONArray(jsonPanelData);
L.e("=== DB === START");
sqLiteDatabase.beginTransaction();
String sql = "Insert or Replace into " + DatabaseHelper.MY_TABLE_NAME + " (" +
LICENSE_NUMBER +
", " + MODEL_NUMBER + ") values(?,?)";
SQLiteStatement insert = sqLiteDatabase.compileStatement(sql);
for (int i = 0; i < ja.length(); i++) {
JSONObject jsl = ja.getJSONObject(i);
insert.bindString(INDEX_OF_LICENSE_NUMBER, jsl.getString("LICENSE_NUMBER"));
insert.bindString(INDEX_OF_MODEL_NUMBER, jsl.getString("MODEL_NUMBER"));
insert.execute();
}
sqLiteDatabase.setTransactionSuccessful();
flag = true;
L.e("=== DB === DONE");
}
} catch (Exception e) {
L.e("=== DB === Error " + e);
} finally {
sqLiteDatabase.endTransaction();
}
return flag;
}