【问题标题】:Android List to DatabaseAndroid 列表到数据库
【发布时间】:2015-02-18 11:47:16
【问题描述】:

我有一个自定义列表,其中包含从在线 mysql 数据库存储的信息。我现在想把这个 List 放到一个 sqlite 内部数据库中。该表已在数据库中创建。我还有一个运行良好的数据库助手类。

所有列表信息都存储在由get和set属性组成的FoodInfoModel类中。

我是否在 databasehelper 类中创建一个方法来一次插入整个列表?不知道该怎么做。

databasehelper 中的当前方法

 public void addDiet(FoodInfoModel foodinfomodel) {


SQLiteDatabase db = getReadableDatabase();

ContentValues values = new ContentValues();
values.put(KEY_DIET_ID, foodinfomodel.getDietID()); 
values.put(KEY_DAY, foodinfomodel.getDay());
values.put(KEY_QTY, foodinfomodel.getQty()); 
values.put(KEY_TIME_FOOD, foodinfomodel.getTime()); 
values.put(KEY_ITEM_FOOD, foodinfomodel.getItem()); 
values.put(KEY_MEASURE, foodinfomodel.getMeasure()); 

// Inserting Row
db.insert("my_diet", null, values);
db.close(); // 
 }

设置列表和适配器的功能

   public void onFetchComplete(List<FoodInfoModel> data) {

    this.data = data;

    System.out.println("data is " + data);

    if(dialog != null)  dialog.dismiss();

    // create new adapter
     adapter = new DietAdapterNew(this, data);
    // set the adapter to list
  setListViewHeightBasedOnChildren(listview);
    listview.setAdapter(adapter);
    adapter.notifyDataSetChanged();


}

如何将该数据列表添加到内部 sqlite 数据库?

谢谢!

【问题讨论】:

    标签: android sqlite android-listview android-adapter


    【解决方案1】:

    你基本上还需要一种方法。

    public void addDiet(List<FoodInfoModel> foodinfomodels) {
        SQLiteDatabase db = getReadableDatabase();
    
        for( FoodInfoModel foodinfomodel : foodinfomodels ){
           ContentValues values = new ContentValues();
            values.put(KEY_DIET_ID, foodinfomodel.getDietID()); 
            values.put(KEY_DAY, foodinfomodel.getDay());
            values.put(KEY_QTY, foodinfomodel.getQty()); 
            values.put(KEY_TIME_FOOD, foodinfomodel.getTime()); 
            values.put(KEY_ITEM_FOOD, foodinfomodel.getItem()); 
            values.put(KEY_MEASURE, foodinfomodel.getMeasure()); 
    
            // Inserting Row
            db.insert("my_diet", null, values);
        }
    
        db.close(); // 
    }
    

    【讨论】:

    • 这个答案正是我一直在寻找的,非常感谢你! 10 分!
    【解决方案2】:

    是的,你必须在 DatabaseHelper 类中创建这种方法

    public class DatabaseHandler extends SQLiteOpenHelper {
    public void insertFoodInfo(ChatBase chat) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(KEY_DIET_ID, foodinfomodel.getDietID());
        values.put(KEY_DAY, foodinfomodel.getDay());
        values.put(KEY_QTY, foodinfomodel.getQty());
        values.put(KEY_TIME_FOOD, foodinfomodel.getTime());
        values.put(KEY_ITEM_FOOD, foodinfomodel.getItem());
        values.put(KEY_MEASURE, foodinfomodel.getMeasure());
    
        db.insert("my_diet", null, values);
        db.close();
    }
    
    public void updateFoodInfo(FoodInfoModel  model) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(KEY_DIET_ID, foodinfomodel.getDietID());
        values.put(KEY_DAY, foodinfomodel.getDay());
        values.put(KEY_QTY, foodinfomodel.getQty());
        values.put(KEY_TIME_FOOD, foodinfomodel.getTime());
        values.put(KEY_ITEM_FOOD, foodinfomodel.getItem());
        values.put(KEY_MEASURE, foodinfomodel.getMeasure());
    
        db.update("my_diet", values, KEY_DIET_ID + "=" + model.getId(),null);
        db.close();
    }
    

    }

    然后在循环中更新或插入每个 FoodInfoModel

    并且对于批量插入可以使用此代码

    db.beginTransaction();
        try {
            ...
            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }
    

    【讨论】:

    • 也许你可以使用 bulkInsert 来提高性能。所以基本上你开始一个事务,然后在你的列表中循环插入,完成后,提交事务
    【解决方案3】:

    您应该创建一个带有 public static 函数的单独类,这些函数处理与 SQL 事务关联的 CRUD(创建、读取、更新和删除)函数。

    示例(SQLcrud.java):

    public static boolean insertObject(SQLdatabase localDB, Object insertObject)
    {
        // Test if things are not null and that the DB is open and writable.
    
        // Insert the object
    
        // If insert successful, return TRUE.
    
        // If anything wrong or insert not successful return FALSE (or int indicating what went wrong.
    }
    

    实际例子:

    public static boolean insertLocalAdr(SQLiteDatabase db, PersonAddress adr, boolean deleteCurrent, boolean transaction)
            throws SQLFunctionFailed {
        if(db != null && adr != null)
        {
            try
            {
                // If the connection is open and writable.
                SQLiteGeneral.openAndWritable(db);
    
                if(deleteCurrent)
                {
                    deleteLocalAdr(db, transaction);
                }
    
                String sqlStmt = GeneralSQLfunctions.getUserAdrInsert(
                        adr,
                        PersonAddress.ADR_TABLE_NAME,
                        GeneralSQLfunctions.databaseType.SQLITE);
    
                return StmtExecution(db, sqlStmt, transaction);
    
            }
            catch (SQLException e)
            {
                e.printStackTrace();
                throw new SQLFunctionFailed(e.getMessage());
            }
        }
        else
        {
            throw new SQLFunctionFailed("Given DB or Adr was NULL! FATAL ERROR!");
        }
    }
    

    注意:GeneralSQLfunctions.getUserAdrInsert 只是获取一个简单格式化的 INSERT 语句,StmtExecution 只是在 SQL DB 上执行该语句。它们是为了简化。 SQLiteGeneral.openAndWritable(db) 抛出(自定义)SQLFunctionFailed 异常,因此函数失败并且不会继续。

    【讨论】:

      【解决方案4】:

      在遍历每个列表项时,您可以启动一个新的 AsyncTask 或 Thread 以使其更快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多