繁体   English   中英

将值插入android sqlite数据库的最快方法

[英]Fastest way to insert values to android sqlite database

我想创建一个数据库,并在应用程序开始时填充它。 它将保持不变,并且永远不会改变。 将会有1000个条目。 这样做的好方法是什么?

到目前为止,我已经创建了表格,但是现在我必须用1000个条目填充它。 是否有UI?

public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL("CREATE TABLE "+TABLE_NAME+" ("+
            UID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+
            USER_NAME+" TEXT NOT NULL, "+
            USER_TYPE+" TEXT NOT NULL, "+
            USER_CLASS+" TEXT NOT NULL);"


        );

改善性能的几种方法:

正如Tsunaze所建议的,您应该在另一个线程中执行此操作,您可以检查AsyncTask,它是SDK中提供的“默认”工具。


考虑使用交易:

db.beginTransaction();
for(...){
    db.insert(...);
}
db.commit();

这样,您仅在完成所有值的插入后才写入数据库,从而加快了过程。


做大量插入:

insert into table
select value1X, value1Y, value1Z
union all
select value2X, value2Y, value2Z
union all
select value3X, value3Y, value3Z
union all
select value4X, value4Y, value4Z

您可以创建文件“ table_inserts.sql”并将其放在“ raw”文件夹中。

    private void insertValues(SQLiteDatabase db) {
        db.beginTransaction();
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(context.getResources().openRawResource(R.raw.table_inserts))));
            String s;
            while ((s = reader.readLine()) != null) {
                db.execSQL(s);
            }
            reader.close();
        } catch (IOException ignored) {
        }
        db.setTransactionSuccessful();
        db.endTransaction();
    }

或者您可以将所有插入代码编写。

您需要在线程中执行此操作,以不阻塞主UI:

public void addObjects(List<Object> objects, OnQueryListener listener){
listener.begin();
database.beginTransaction();
for(int i = 0; i < objects.size();i++{
// Add
}
database.setTransactionSuccessful();
database.endTransaction();
listener.end();
}

private interface OnQueryListener{
void begin();
void end();
}

然后在您的主代码中执行以下操作:

Handler h = new Handler();
Thread t = new Thread(run);
t.start();

Runnable run = new Runnable{

void run(){
addObjects(objects, new OnQueryListener{

void begin(){

}
void end(){
handler.post(new Runnable{
void run(){
// On your main UI
}
}
}
}
}
}

这不是我已经在真实代码上测试过的东西,只是我脑海中的最高点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM