改善SQLite性能的建议

时间:2018-09-26 10:09:06

标签: android

我正在将数据保存到SQLite数据库。保存少量数据需要一段时间。我正在使用:beginTransaction(); setTransactionSuccessful();, endTransaction();等等,但这并不能提高性能。如果无法改善,我正在考虑切换到RealmDB。有人有提示吗?干杯

public enum DbSingleton {
    INSTANCE;
    private DatabaseHandler db;
    public Context context;


    private DatabaseHandler getDatabaseHandler(Context context) {
        if (db != null) {
            return db;
        } else {
            if (MainActivity.mainActivity == null) {

                SQLiteDatabase.loadLibs(context);

                return db = new DatabaseHandler(context); //make static context field in area this is used. e.g. main
            } else {
                return db = new DatabaseHandler(MainActivity.mainActivity);
            }
        }
    }


    //will provide one sample for reference now

    public void insert(Context context, String table, ContentValues values) {
           SQLiteDatabase.loadLibs(MainActivity.mainActivity);
        //note this line
        SQLiteDatabase sql = getDatabaseHandler(context).getWritableDatabase(DatabaseHandler.DB_PASSWD);
        try {
            sql.beginTransaction();


            sql.insert(table, null, values);
            // Log.i("Values being sent to db", values.toString());

            sql.setTransactionSuccessful();
            sql.endTransaction();
        } catch (SQLiteException ex) {
            Log.e("SQL EXCEPTION", ex.toString());
        } finally {
            sql.close();
        }
    }
    public Cursor select(Context context, String statement, String[] selectArgs) {
        SQLiteDatabase sql = getDatabaseHandler(context).getReadableDatabase(DatabaseHandler.DB_PASSWD);
        if (selectArgs == null) {

            return sql.rawQuery(statement, null);

        } else {
            return sql.rawQuery(statement, selectArgs);
        }

    }

    public int Update(Context context, String table, ContentValues values, String where, String[] whereArgs) {

        SQLiteDatabase sql = getDatabaseHandler(context).getWritableDatabase(DatabaseHandler.DB_PASSWD);
        int count = -1;

        try {
            sql.beginTransaction();
            count = sql.update(table, values, where, whereArgs);
            sql.setTransactionSuccessful();
            sql.endTransaction();
        } catch (SQLiteException ex) {
            Log.e("SQL EXCEPTION", ex.toString());
        }

        if (count == 0) count = -1;
        return count;

    }
    public void Drop(Context context, String table) {
        SQLiteDatabase sql = getDatabaseHandler(context).getWritableDatabase(DatabaseHandler.DB_PASSWD);

        sql.execSQL("DROP TABLE IF EXISTS " + table);

    }
    public void Create(Context context, String table) {

        SQLiteDatabase sql = getDatabaseHandler(context).getWritableDatabase(DatabaseHandler.DB_PASSWD);
        sql.beginTransaction();
        sql.execSQL(table);
        sql.setTransactionSuccessful();
        sql.endTransaction();
    }

2 个答案:

答案 0 :(得分:2)

仅在执行多次插入操作时才将插入物包装在beginTransaction()endTransaction()中。

因此,始终使用以下格式一次将数据保存到一个表中,这将大大提高性能:

ArrayList<String> itemsToInsert; //an array of strings you want to insert
db.beginTransaction();
ContentValues values = new ContentValues(1);
for (int i = 0; i < itemsToInsert.size(); i++) {
    values.put('field', itemsToInsert.get(i));
    db.insert(table, null, values);
}
db.setTransactionSuccessful();
db.endTransaction();

此外,对于从表中进行选择,query()的性能要比rawQuery()稍好,但差异很小。


也请查看本文以获取有关SqlLite Performance的更多背景信息: sqlite-insertions

答案 1 :(得分:2)

Android提供了一个新的库,作为称为Room的体系结构组件的一部分。

官方文档说:

  

Room持久性库在SQLite上提供了一个抽象层   在利用完整数据库的同时允许更健壮的数据库访问   SQLite的强大功能。

Room Persistence Library

Save data in a local database using Room

更多:

您可以将会议室与另一个很棒的图书馆(Paging Library)一起使用,以处理分页和大量数据集

Paging library