我有一个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 - 还有其他方法吗?
答案 0 :(得分:1)
我使用 sqlite 在代码下方插入数千条记录。
这是创建表查询:
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 是独一无二的,查询会自动管理您不必担心的插入/更新。
这里我正在从sdcard读取json格式的文件并将其插入 源码:
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;
}