【问题标题】:how to insert multiple rows into sqlite android如何在sqlite android中插入多行
【发布时间】:2017-07-25 23:40:15
【问题描述】:

我有一种方法可以将值插入到类中的sqlite 中。在主要活动中,我正在解析 json 值并尝试在循环中将这些值插入sqlite,因为我必须插入多行。但是只有一行被添加到数据库中。

添加多行的方法如下:

public void addSession(String sessionname,String start_time,String end_time,String id) {
        SQLiteDatabase db = this.getWritableDatabase();
        try {
            db.beginTransaction();
            String sql = "Insert into session (id, sessionname,start_time, end_time) values(?,?,?,?)";
            SQLiteStatement insert = db.compileStatement(sql);
            insert.bindString(1, id);
            insert.bindString(2, sessionname);
            insert.bindString(3, start_time);
            insert.bindString(4, end_time);
            insert.execute();
            db.setTransactionSuccessful();
        } catch (Exception e) {
            Log.w("Appet8:",e );
        } finally {
         db.endTransaction();
        }
    }

在下面的 for 循环中,我尝试将值添加到 sqlite 表中:

JSONObject jsonObject = new JSONObject(response);
JSONArray foodsessions = jsonObject.getJSONArray("foodsessions");
for(int i=0;i<foodsessions.length();i++) {
                   JSONObject session_object = foodsessions.getJSONObject(i);
                   String session = session_object.getString("sessionname");
                   String start_time = session_object.getString("start_time");
                   String end_time = session_object.getString("end_time");
                   String session_id = session_object.getString("id");                                
 db.addSession(session,start_time,end_time,session_id);
                       }                       

【问题讨论】:

标签: android mysql json sqlite


【解决方案1】:

更好的结构是在方法外部创建一个 db 引用,并将其作为引用传递:

SQLiteDatabase db = this.getWritableDatabase();
db.beginTransaction();

// your for loop

db.setTransactionSuccessful();
db.endTransaction();

=============== 请检查下面哪个用于插入多行:

// adb is SQLiteOpenHelper
JSONObject jsonObject = new JSONObject(response);
JSONArray foodsessions = jsonObject.getJSONArray("foodsessions");
int length = foodsessions.length();

for (int i = 0; i < length; i++) {
    JSONObject o = foodsessions.getJSONObject(i);
    String session = session_object.getString("sessionname");
    String start_time = session_object.getString("start_time");
    String end_time = session_object.getString("end_time");
    String session_id = session_object.getString("id");    

    SQLiteDatabase db = adb.getWritableDatabase();

    ContentValues newValues = new ContentValues();
    newValues.put(adb.ATTRIBUTE_session, session);
    newValues.put(adb.ATTRIBUTE_start_time, start_time);
    newValues.put(adb.ATTRIBUTE_end_time, end_time);
    newValues.put(adb.ATTRIBUTE_session_id, session_id);

    long res = db.insertWithOnConflict(adb.TABLE_NAME, null, newValues, SQLiteDatabase.CONFLICT_REPLACE);
    db.close();
}

如果可以通过SQLiteDatabase提供的方法完成,更好的解决方案是避免使用原始查询。

【讨论】:

  • 无法在课堂外获得db.beginTransaction();。 For 循环在其他类中
  • 请检查我的更新,如果你使用 ContentValues 应该没问题
  • 谁在循环中打开和关闭数据库?太疯狂了!
  • @VaruniNR “无法在课堂外获得 db.beginTransaction();”是什么意思?如果你创建了数据库实例,你可以在任何你想要的地方使用它..
  • 我认为这是插入多个“列”,不是吗?
【解决方案2】:

这更简单:

INSERT INTO tb_units (sort, name, isdef) VALUES
(1, "عدد",1),
(2, "کیلوگرم",1),
(3, "گرم",1),
(4, "کیلومتر",1),
(5, "متر",1),
(6, "متراژ",1),
(7, "مگابایت",1),
(8, "کیلوبایت",1),
(9, "مثقال",1),
(10, "شاخه",1),
(11, "صفحه",1),
(12, "رول",1),
(13, "بسته",1),
(14, "کارتن",1),
(15, "دستگاه",1),
(16, "پاکت",1),
(17, "مورد",1),
(18, "جعبه",1),
(19, "تن",1),
(20, "قطعه",1),
(21, "حلقه",1),
(22, "تخته",1),
(23, "جلد",1),
(24, "لیتر",1),
(25, "مترمکعب",1),
(26, "مترمربع",1),
(27, "دست",1),
(28, "جین",1),
(29, "اشتراک",1),
(30, "سری",1),
(31, "گیگابایت",1),
(32, "جلسه",1),
(33, "جفت",1),
(34, "قراض",1),
(35, "ساعت",1),
(36, "تن",1);

我们用db.execSQL查询

【讨论】:

  • @user25 不要过于聪明,告诉我有多个插入语句更简单。这不是 db.execSQL 的工作方式。
  • 你必须使用 Android API 包装器和数据库事务
猜你喜欢
  • 1970-01-01
  • 2012-04-19
  • 2017-10-23
  • 2021-05-25
  • 2014-02-27
  • 2020-03-30
  • 1970-01-01
  • 2013-02-07
  • 2021-12-03
相关资源
最近更新 更多