将大型列表插入SQL数据库的最佳方法是什么? [ANDROID]

时间:2012-09-11 19:06:49

标签: java android sql database list

这是我想要做的,我已经创建了一个SQL数据库来容纳一个巨大的饮料表,该表看起来像这样:

    **_ID    ALCOHOL   TYPE    BRAND    PRICE**

实施例。 1酒伏特加Smirnoff 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 个答案:

答案 0 :(得分:2)

我不建议在源代码中对它们进行硬编码,因为您将拥有双倍的数据(然后是一些数据),并且会吸引用户的RAM和存储空间。

我认为没有充分的理由让您在运行时将列表静态加载到数据库中。我还假设你已经有了饮料清单。

我会从列表中创建一个CSV文件,然后在我的PC上使用桌面SQLite编辑器将列表加载到我的表中,然后将数据库作为资源包含在我的应用程序中。

Google将引导您加入大量SQLite编辑。

在将其移至Android之前,我在PC上完成了所有数据库设计和初始加载/测试。它更容易,更快。

祝你好运。

答案 1 :(得分:0)

你可以这样做:

SQLiteDatabase db = mOpenHelper.getWritableDatabase();

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

您可以阅读有关begintransaction和end transaction SQLite Optimization in Android

的更多信息