2012-09-11 88 views
-1

這就是我要做的,我創建了一個SQL數據庫來保存飲料的巨型表,該表是這樣的:將大型列表插入SQL數據庫的最佳方式是什麼? [ANDROID]

**_ID ALCOHOL TYPE BRAND PRICE** 

例。 1酒伏特加斯米爾諾夫14

這裏是我的數據庫適配器代碼:

package net.learn2develop.Database; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DBAdapter { 

public static final String KEY_ROWID = "_id"; 
public static final String KEY_ALCOHOL = "alcohol"; 
public static final String KEY_TYPE = "type"; 
public static final String KEY_BRAND = "brand"; 
public static final String KEY_PRICE = "price"; 
private static final String TAG = "DBAdapter"; 

private static final String DATABASE_NAME = "booze"; 
private static final String DATABASE_TABLE = "titles"; 
private static final int DATABASE_VERSION = 1; 

private static final String DATABASE_CREATE = 
    "create table titles (_id integer primary key autoincrement, " 
    + "alcohol text not null, type text not null, " 
    + "brand text not null);" + "price integer not null"; 

private final Context context; 

private DatabaseHelper DBHelper; 
private SQLiteDatabase db; 

public DBAdapter(Context ctx) 
{ 
    this.context = ctx; 
    DBHelper = new DatabaseHelper(context); 
} 

private static class DatabaseHelper extends SQLiteOpenHelper 
{ 
    DatabaseHelper(Context context) 
    { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
     db.execSQL(DATABASE_CREATE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, 
          int newVersion) 
    { 
     Log.w(TAG, "Upgrading database from version " + oldVersion 
       + " to " 
       + newVersion + ", which will destroy all old data"); 
     db.execSQL("DROP TABLE IF EXISTS titles"); 
     onCreate(db); 
    } 
} 

    //---opens the database--- 
    public DBAdapter open() throws SQLException 
{ 
    db = DBHelper.getWritableDatabase(); 
    return this; 
} 

//---closes the database---  
public void close() 
{ 
    DBHelper.close(); 
} 

//---insert a title into the database--- 
public long insertTitle(String alcohol, String type, String brand, int price) 
{ 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_ALCOHOL, alcohol); 
    initialValues.put(KEY_TYPE, type); 
    initialValues.put(KEY_BRAND, brand); 
    initialValues.put(KEY_PRICE, price); 
    return db.insert(DATABASE_TABLE, null, initialValues); 
} 

//---deletes a particular title--- 
public boolean deleteTitle(long rowId) 
{ 
    return db.delete(DATABASE_TABLE, KEY_ROWID + 
      "=" + rowId, null) > 0; 
} 

//---retrieves all the titles--- 
public Cursor getAllTitles() 
{ 
    return db.query(DATABASE_TABLE, new String[] { 
      KEY_ROWID, 
      KEY_ALCOHOL, 
      KEY_TYPE, 
      KEY_BRAND, 
      KEY_PRICE}, 
      null, 
      null, 
      null, 
      null, 
      null); 
} 

//---retrieves a particular title--- 
public Cursor getTitle(long rowId) throws SQLException 
{ 
    Cursor mCursor = 
      db.query(true, DATABASE_TABLE, new String[] { 
        KEY_ROWID, 
        KEY_ALCOHOL, 
        KEY_TYPE, 
        KEY_BRAND, 
        KEY_PRICE 
        }, 
        KEY_ROWID + "=" + rowId, 
        null, 
        null, 
        null, 
        null, 
        null); 
    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 
} 

//---updates a title--- 
public boolean updateTitle(long rowId, String alcohol, 
String type, String brand, int price) 
{ 
    ContentValues args = new ContentValues(); 
    args.put(KEY_ALCOHOL, alcohol); 
    args.put(KEY_TYPE, type); 
    args.put(KEY_BRAND, brand); 
    args.put(KEY_PRICE, price); 
    return db.update(DATABASE_TABLE, args, 
        KEY_ROWID + "=" + rowId, null) > 0; 
} 

} 

現在我知道我可以在我的主要活動逐一新增致電:

//---add 2 titles--- 
    db.open();   
    long id; 
    id = db.insertTitle(
      "Liquor", 
      "Vodka", 
      "Smirnoff", 
        "14");   
    id = db.insertTitle(
      "Liquor", 
      "Rum", 
      "Captain Morgan", 
        "20"); 
    db.close(); 

的問題是我有數百個添加....什麼是將它們全部添加到數據庫中的最佳方式? 在此先感謝您的幫助!我還在學習,我從來沒有使用過數據庫,所以現在我就丟了儀式。

回答

2

我不會建議很難在你的信源編碼它們,因爲你將有雙倍的數據(然後是一些),並將吸引用戶的RAM和存儲空間。

我認爲沒有很好的理由讓你在運行時將列表靜態加載到數據庫中。我還假設你已經有了飲料清單。

我會從列表中創建一個CSV文件,然後使用我的PC上的桌面SQLite編輯器將列表加載到我的表中,然後將數據庫作爲資源包含在我的應用程序中。

谷歌會引導你大量的SQLite編輯器。

我把我所有的數據庫設計和初始加載/測試都放到我的電腦上,然後再把它移到Android上。這更容易和更快。

祝你好運。

+0

有沒有教程可以指導我如何做到這一切?你完全是禮節,但我想硬編碼的所有選項,我已經有一個飲料的列表,我要求教程的唯一原因是因爲我從來沒有使用數據庫前lol – Hockeyman271

+1

對於PC編輯,我使用SQLite數據庫瀏覽器 - 開源和SourceForge。這真的很容易開始。想象一個數據庫表,就像電子表格表中的行和列。該數據庫類似於多張表格(表格)的電子表格(好貴族,只有Lotus 1-2-3閃回)。只需使用列名稱和類型創建數據庫和飲料表以匹配CSV(列名中不包含空格,大小寫無關,並查看數據中的撇號)。嘗試從這裏開始http://www.sqlite.org/cvstrac/wiki/wiki?p=ImportingFiles – Simon

+0

非常感謝!我應該只使用我已經創建的現有數據庫嗎?如果是的話,我該如何將它從我的應用程序項目中提取出來? – Hockeyman271

0

你可以做這樣的事情:

SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 

db.beginTransaction(); 
try { 
    for(ContentValues con:conValues){ 
    db.insert(TABLE_COLUMN,null,con); 
} 
    db.setTransactionSuccessful(); 
} 
    finally { 
    db.endTransaction(); 
} 

你可以閱讀更多有關的BeginTransaction和結束交易SQLite Optimization in Android

相關問題