如何在 Android 中将 Arraylist 插入 sqlite?

Posted

技术标签:

【中文标题】如何在 Android 中将 Arraylist 插入 sqlite?【英文标题】:How to insert Arraylist into sqlite in Android ? 【发布时间】:2014-02-27 19:47:14 【问题描述】:

我想将 Arraylist 插入到我的 sqlite 中,但在 anggota 列中没有相同的值,其 id 如下所示:

helper=new DBSpaj(getActivity());
    for (int i=0; i<ListKeluargaPP.size();i++)  
    helper.insertTableMarital(
            a,
            ListKeluargaPP.get(i).getAnggota_pp(),
            ListKeluargaPP.get(i).getNama_Anggota_pp(),
            ListKeluargaPP.get(i).getTtl_Anggota_pp()

);

这是我的插入代码:

public void insertTableMarital(
        String master_id,
        String anggota,
        String nama,
        String ttl
        ) 

String selectQuery = "SELECT master_id,anggota FROM table_marital " +
        "where master_id='"+Menu_SPPAJ.getX()+"'";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.equals(null))
    ContentValues cv=new ContentValues();
    cv.put("master_id",  master_id);
    cv.put("anggota", anggota);
    cv.put("nama", nama);
    cv.put("ttl", ttl);
    getWritableDatabase().insert("table_marital",null, cv);

    if (cursor.getString(1)!=PemegangPolis.getStrAnggota())
    ContentValues cv=new ContentValues();
    cv.put("master_id",  master_id);
    cv.put("anggota", anggota);
    cv.put("nama", nama);
    cv.put("ttl", ttl);
    getWritableDatabase().insert("table_marital",null, cv);
    else 
        System.out.println("udah ada");
    
           

我想保存的时候报错,logcat如下:

    02-04 10:15:31.274: E/androidRuntime(17174): FATAL EXCEPTION: main
02-04 10:15:31.274: E/AndroidRuntime(17174): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
02-04 10:15:31.274: E/AndroidRuntime(17174):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:418)
02-04 10:15:31.274: E/AndroidRuntime(17174):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
02-04 10:15:31.274: E/AndroidRuntime(17174):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
02-04 10:15:31.274: E/AndroidRuntime(17174):    at id.co.ajsmsig.espaj.DBSpaj.insertTableMarital(DBSpaj.java:912)
02-04 10:15:31.274: E/AndroidRuntime(17174):    at id.co.ajsmsig.espaj.PemegangPolis.onSave(PemegangPolis.java:1574)
02-04 10:15:31.274: E/AndroidRuntime(17174):    at id.co.ajsmsig.espaj.Menu_SPPAJ$SlideMenuClickListener.onClick(Menu_SPPAJ.java:243)
02-04 10:15:31.274: E/AndroidRuntime(17174):    at android.view.View.performClick(View.java:4222)
02-04 10:15:31.274: E/AndroidRuntime(17174):    at android.view.View$PerformClick.run(View.java:17337)
02-04 10:15:31.274: E/AndroidRuntime(17174):    at android.os.Handler.handleCallback(Handler.java:615)
02-04 10:15:31.274: E/AndroidRuntime(17174):    at android.os.Handler.dispatchMessage(Handler.java:92)
02-04 10:15:31.274: E/AndroidRuntime(17174):    at android.os.Looper.loop(Looper.java:137)
02-04 10:15:31.274: E/AndroidRuntime(17174):    at android.app.ActivityThread.main(ActivityThread.java:4895)
02-04 10:15:31.274: E/AndroidRuntime(17174):    at java.lang.reflect.Method.invokeNative(Native Method)
02-04 10:15:31.274: E/AndroidRuntime(17174):    at java.lang.reflect.Method.invoke(Method.java:511)
02-04 10:15:31.274: E/AndroidRuntime(17174):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
02-04 10:15:31.274: E/AndroidRuntime(17174):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
02-04 10:15:31.274: E/AndroidRuntime(17174):    at dalvik.system.NativeStart.main(Native Method)

我不知道我的错在哪里,我希望有人能理解我的问题并帮助我解决我的问题。

【问题讨论】:

为什么要结合插入和选择?你不能创建一个函数来检查游标是否为空,是的,然后插入其他获取数据。否则,插入行,关闭游标,然后调用另一个执行提取的函数 @Rat-a-tat-a-tatRatatouille 因为我想在具有相同 id 的 anggota 列中插入没有相同的值 在这种情况下,尝试将第二个 if 放入 else 中。 【参考方案1】:

我已经解决了我的问题,将所有cursor.getString(1) 放入列表中,然后用这段代码一一检查:

public void insertTableMarital(
        String master_id,
        String anggota,
        String nama,
        String ttl
        ) 

    List<String> test= new ArrayList<String>();
String selectQuery = "SELECT master_id,anggota FROM table_marital " +
        "where master_id='"+Menu_SPPAJ.getX()+"'";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if(cursor.getCount()>0)
    cursor.moveToPosition(cursor.getCount() - 1);
    if (cursor.moveToFirst()) 
        do 
            test.add(cursor.getString(1));
         while (cursor.moveToNext());
     
        Log.i("TES LAIN", PemegangPolis.getStrAnggota());
    if (!(test.contains(PemegangPolis.getStrAnggota())))
    ContentValues cv=new ContentValues();
    cv.put("master_id",  master_id);
    cv.put("anggota", anggota);
    cv.put("nama", nama);
    cv.put("ttl", ttl);
    getWritableDatabase().insert("table_marital",null, cv);
    
    else 
        System.out.println("udah ada");
    

           
else 
    ContentValues cv=new ContentValues();
    cv.put("master_id",  master_id);
    cv.put("anggota", anggota);
    cv.put("nama", nama);
    cv.put("ttl", ttl);
    getWritableDatabase().insert("table_marital",null, cv);


【讨论】:

【参考方案2】:

您需要先调用cursor.moveToFirst(),然后才能使用它,此时它指向第一个(如果有)条目之前

【讨论】:

但大小为 0,所以光标为空,它不会先移动(没有第一个开始)

以上是关于如何在 Android 中将 Arraylist 插入 sqlite?的主要内容,如果未能解决你的问题,请参考以下文章

在Android中将ArrayList转换为String数组

在 Android 中将 ksoap 对象绑定到 ArrayList 时遇到问题

在android中将arraylist <String>值插入sqlite

如何在 Android 中将 JSONArray 转换为 ListView? [复制]

如何在 Android Studio Java 中将数组上传到 Firestore 数据

如何在 Java 中将对象添加到 ArrayList