2014-03-31 95 views
0

我想創建一個數據庫,並在應用程序開始時填充它。它將保持不變,永遠不會改變。將會有1000個條目。有什麼好辦法做到這一點?將值插入到android sqlite數據庫的最快方法

到目前爲止我創建了表格,但現在我必須填寫1000個條目。有沒有用戶界面?

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);" 


     ); 
+1

在哪裏這些1000個條目從何而來?如果您在發佈應用程序之前瞭解它們,請使用一些工具來構建數據庫([用於sqlite的GUI工具](https://www.sqlite.org/cvstrac/wiki?p=ManagementTools))並通過[ SQLiteAssetOpenHelper](https://github.com/jgilfelt/android-sqlite-asset-helper)。 – zapl

+0

請試試這個,謝謝。 – user3316779

回答

1

幾種方法來提高性能:

由於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 
0

您可以創建文件「table_inserts.sql」並將其放入「原始」文件夾中。

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(); 
    } 

或者您可以在代碼中寫入所有插入。

0

你需要做的是在一個線程中,沒有塊主界面:

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 
} 
} 
} 
} 
} 
} 

這不是我在真實的代碼上測試,只是在我頭頂。

相關問題