【问题标题】:Android Studio SQLite dont insert data into database if data already exists [closed]如果数据已经存在,Android Studio SQLite 不会将数据插入数据库[关闭]
【发布时间】:2021-04-09 16:20:18
【问题描述】:

我正在阅读这篇文章 (Android Studio Sqlite don't insert in database if value already exists),因为我有同样的问题。我遵循并复制了 Phan Van Linh 的步骤,但我遇到了 nullPointerException

的错误

在我的 DatabaseHelper.java

中的某个地方
public Boolean verifyData(String TABLE_NAME, String id){
        String query = "SELECT * FROM " + TABLE_NAME + " WHERE " + id + " = ?";
        Cursor res = db.rawQuery(query, null);         <------------ LINE 42
    if (res.moveToFirst()){
        res.close();
        return true;
    }

    res.close();
    return false;

}
public long insertData(String name,String surname,String id){
    if (verifyData(TABLE_NAME, id)){            <------------ LINE 53
        return 0;
    }

    // set the format to sql date time
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
    Date date = new Date();
    Date time = new Date();

    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL_1, dateFormat.format(date));
    contentValues.put(COL_2, timeFormat.format(time));
    contentValues.put(COL_3, name);
    contentValues.put(COL_4, surname);
    contentValues.put(COL_5, id);
    long result=db.insert(TABLE_NAME, null, contentValues);
    return result;

}

在我的 MainActivity.java

中的某个地方
public void AutoAdd(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd 'at' HH:mm:ss");
        String currentDateandTime = sdf.format(new Date());

LINE 329 ------> long isInserted = myDb.insertData(theName.getText().toString(), theSur.getText().toString(), theId.getText().toString());

    }

Logcat

2021-04-10 09:24:17.889 16707-16707/com.example.AppDraft3 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.AppDraft3, PID: 16707
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.AppDraft3/com.example.AppDraft3.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3654)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3806)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2267)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:8167)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])' on a null object reference
        at com.example.AppDraft3.DatabaseHelper.verifyData(DatabaseHelper.java:42)
        at com.example.AppDraft3.DatabaseHelper.insertData(DatabaseHelper.java:53)
        at com.example.AppDraft3.MainActivity.AutoAdd(MainActivity.java:329)
        at com.example.AppDraft3.MainActivity.onCreate(MainActivity.java:86)
        at android.app.Activity.performCreate(Activity.java:7963)
        at android.app.Activity.performCreate(Activity.java:7952)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3629)

【问题讨论】:

  • 在调用 insertData() 之前你必须已经打开了你的数据库,你的变量 db 不能为空。还发布 logcat 或“ERROR HEREEEEEEE”并没有告诉我们任何信息
  • 对不起,添加了 logcat 先生。

标签: java android sqlite


【解决方案1】:

您需要添加一个实例化变量/对象 db 的行,例如:-

public Boolean verifyData(String TABLE_NAME, String id){
        SQLiteDatabase db = this.getWritableDatabase(); //<<<<<<<<<< ADDED
        String query = "SELECT * FROM " + TABLE_NAME + " WHERE " + id + " = ''";
        Cursor res = db.rawQuery(query, null);         <------------ ERROR HEREEEEEEE
    if (res.moveToFirst()){
        res.close();
        return true;
    }
    res.close();
    return false;
}

但是,verifyData 方法正在尝试提取传递的 id = '' 的记录,因此将始终返回 false。

我认为你应该因此另外改变

String query = "SELECT * FROM " + TABLE_NAME + " WHERE " + id + " = ''";

到:-

String query = "SELECT * FROM " + TABLE_NAME + " WHERE id = '" + id + "'";

如果 id 列被定义为 UNIQUE(它可能应该是),那么作为方便的 insert 方法使用相当于INSERT OR IGNORE,它将忽略重复的 id 并返回 -1 值而不插入行(因此不需要 verifyData 方法)

【讨论】:

  • 添加 writeableDatabase 会消除错误,但它仍然会添加一个条目,即使它有重复项
  • @MRPenguin 尽管空指针异常的问题已经解决。我已经修改了答案以解决您遇到的下一个问题。请注意,后续问题应导致后续问题。
  • 先生,非常感谢!!即使我的帖子是重复的,我真的很高兴你仍然回答了我的后续问题。你刚刚救了我和我的团队!! ?? ☜(^▿^c)
猜你喜欢
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 2012-09-07
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多