我想创建一个数据库,并在应用程序开始时填写它。它将保持不变,永远不会改变。将有1000个条目。这样做的好方法是什么?
我到目前为止创建了这个表,但是现在我必须填写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);"
);
答案 0 :(得分: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
答案 1 :(得分:0)
你可以创建文件“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();
}
或者您可以在代码中编写所有插入内容。
答案 2 :(得分:0)
你需要在一个线程中执行它,不要阻止主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
}
}
}
}
}
}
这不是我在实际代码上测试的东西,只是我头脑中的东西。