2014-03-31 2 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 записей взялись? Если вы знаете их перед отправкой приложения, возьмите некоторый инструмент для создания базы данных (есть [инструменты GUI для sqlite] (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» и поместить его в папку «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(); 
    } 

или вы можете написать все вставки в коде.

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

Это не то, что я имею проверен на реальном коде, просто что-то на вершине моей головы.

Смежные вопросы