Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在Sqlite slow中插入行_Android_Database_Sqlite - Fatal编程技术网

Android 在Sqlite slow中插入行

Android 在Sqlite slow中插入行,android,database,sqlite,Android,Database,Sqlite,我正在尝试将行插入SQLite数据库。插入130行需要7秒钟,这对我来说似乎很慢 表定义为: sd.execSQL("CREATE TABLE " + V2VocabsTable.TABLE_NAME + " (" + V2VocabsTable.ID + " VARCHAR(10) PRIMARY KEY ," + V2VocabsTable.NAME + " VARCHAR(255), " + V

我正在尝试将行插入SQLite数据库。插入130行需要7秒钟,这对我来说似乎很慢

表定义为:

    sd.execSQL("CREATE TABLE " + V2VocabsTable.TABLE_NAME + " (" 
            + V2VocabsTable.ID   + " VARCHAR(10) PRIMARY KEY ," 
            + V2VocabsTable.NAME    + " VARCHAR(255), " 
            + V2VocabsTable.LOADED  + " VARCHAR(1) " 
            + ");"
            );
要插入行,我使用以下代码:

public void addTableStatus(String tableId, String name) {

    Log.d("DB","Before Insert");

    ContentValues cv = new ContentValues();
    cv.put(V2VocabsTable.ID, "Table " + tableId);
    cv.put(V2VocabsTable.NAME, name);
    cv.put(V2VocabsTable.LOADED, "NO");
    SQLiteDatabase sd = getWritableDatabase();
    long result = sd.insert(V2VocabsTable.TABLE_NAME,   null, cv);

    Log.d("DB","After Insert :: " + result);
    }
日志文件中的时间为:

 12-17 23:00:11.445: D/SQLDB(25384): Init
 12-17 23:00:11.455: D/DB(25384): Before Insert
 12-17 23:00:11.505: D/SQLDB(25384): Open
 12-17 23:00:11.895: D/DB(25384): After Insert :: 1
 12-17 23:00:11.895: D/DB(25384): 0001 :: AdministrativeSex-v1.0.xml
 12-17 23:00:11.895: D/DB(25384): Before Insert
 12-17 23:00:11.965: D/DB(25384): After Insert :: 2
 12-17 23:00:11.965: D/DB(25384): 0002 :: MaritalStatus-v1.0.xml
 12-17 23:00:11.965: D/DB(25384): Before Insert
 12-17 23:00:12.005: D/DB(25384): After Insert :: 3
 12-17 23:00:12.005: D/DB(25384): 0004 :: PatientClass-v1.0.xml
 12-17 23:00:12.005: D/DB(25384): Before Insert
 12-17 23:00:12.145: D/DB(25384): After Insert :: 4

 12-17 23:00:18.815: D/DB(25384): Before Insert
 12-17 23:00:18.865: D/DB(25384): After Insert :: 131
 12-17 23:00:18.865: D/DB(25384): ZU057 :: LocationHiding-v1.0.xml
 12-17 23:00:18.865: D/DB(25384): Before Insert
 12-17 23:00:18.925: D/DB(25384): After Insert :: 132

这对我来说似乎太慢了,是什么让它慢下来的?

由于涉及IPC和SD卡访问时间,DB操作可能非常慢,但我没有测量它。但是,您可以执行bulkInsert或applyBatch,而不是执行数百次插入。您是否计划调查其速度慢的原因或寻找更快的方法?

由于涉及IPC和SD卡访问时间,DB操作可能非常慢,但我尚未测量它。但是,您可以执行bulkInsert或applyBatch,而不是执行数百次插入。您是否计划调查其速度慢的原因或寻找更快的方法?

作为替代方案,您可以在assest中保留build ready数据库文件,并在/data/data/XX/database下进行硬拷贝/写入


它适用于一次性安装。

作为一种替代方法,您可以在assest中保存build ready数据库文件,并在/data/data/XX/database下进行硬拷贝/写入

public DataBase openWithTrans() throws SQLException {
    ourHelper = new DataBaseHelper(ourContext, DATABASE_NAME,
            DATABASE_LOCATION);
    db = ourHelper.getWritableDatabase();
    db.beginTransaction();
    return this;
}

public void closeWithTrans() {
    try {

        db.setTransactionSuccessful();


    } catch (Exception e) {
        e.printStackTrace();
    }finally{

        db.endTransaction();
        Debug.debugMsg("end trans successful");
        db.close();
        Debug.debugMsg("close db successful");
        if (ourHelper != null) {
            ourHelper.close();
        }
    }

}
它适合一次性安装

public DataBase openWithTrans() throws SQLException {
    ourHelper = new DataBaseHelper(ourContext, DATABASE_NAME,
            DATABASE_LOCATION);
    db = ourHelper.getWritableDatabase();
    db.beginTransaction();
    return this;
}

public void closeWithTrans() {
    try {

        db.setTransactionSuccessful();


    } catch (Exception e) {
        e.printStackTrace();
    }finally{

        db.endTransaction();
        Debug.debugMsg("end trans successful");
        db.close();
        Debug.debugMsg("close db successful");
        if (ourHelper != null) {
            ourHelper.close();
        }
    }

}
上述代码将使您能够进行交易。在转换模式下,您应该能够将速度提高很多。正如评论所指出的,您启动事务,然后插入x行数,然后关闭它


上述代码将使您能够进行交易。在转换模式下,您应该能够将速度提高很多。正如评论所指出的,您启动事务,然后插入x行数,然后关闭它。

我不知道为什么每次插入都要调用
getWritableDatabase()
,但是这里的答案可能会让您感兴趣:。使用Traceview来确定性能问题的具体位置。我不确定为什么每次插入都要调用
getWritableDatabase()
,但这里的答案可能会让您感兴趣:。使用Traceview来确定性能问题的具体位置。重要的是对所有130个插入使用一个事务。这正是所需的。我把所有的插入放在一个事务中,130个插入都发生在0.3秒内。重要的是对所有130个插入使用一个事务。这正是所需要的。我将所有插入放在一个事务中,130个插入都发生在0.3秒内。