主键ID给我重复" 0" Android应用程序的价值

时间:2018-04-22 21:55:21

标签: android-sqlite

我尝试使用android制作contactsApp,当我调试它时,主键重复其值为零 此处 SQLiteOpenHelper类

    // get all Contacts
    public List<Contact> getAllContact(){
        SQLiteDatabase db = this.getReadableDatabase();    
        List<Contact> contactList = new ArrayList<>();    
        String selectAll = "SELECT * FROM " + Util.TABLE_NAME;    
        Cursor cursor = db.rawQuery(selectAll , null);
        if (cursor.moveToFirst()){
            do {
                Contact contact = new Contact();
               // HERE is where the error come...
                try{
                    if (cursor.getString(0) != null)
                     contact.setId(Integer.parseInt(cursor.getString(0)));
                }catch (Exception e){e.printStackTrace();}

                contact.setName(cursor.getString(1) );
                contact.setPhoneNumber(cursor.getString(2));
                contactList.add(contact);
            }while (cursor.moveToNext());
        }
        return contactList;
    }

起初错误是此行的NonNullException

  

contact.setId(的Integer.parseInt(cursor.getString(0)));

所以我用try catch包围它然后应用程序调试正确但仍然为INTEGER PRIMARY KEY id提供了错误的值

最终结果应该是

  

ID:1,姓名1,111111111

     

ID:2,Name 2,222222222

     

ID:3,姓名3,333333333

     

ID:4,姓名4,444444444

但我得到了这个结果..

  

ID:0,名称1,111111111

     

ID:0,Name 2,222222222

     

ID:0,姓名3,333333333

     

ID:0,姓名4,444444444

经过一些搜索,我找不到任何解决办法!

那么我应该怎么做才能解决这个问题 ??

提前致谢!

修改 堆栈跟踪:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.muhamad_galal.databaseintro, PID: 3947
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.muhamad_galal.databaseintro/com.example.muhamad_galal.databaseintro.MainActivity}: java.lang.NumberFormatException: Invalid int: "null"
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                      at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077)
                      at android.app.ActivityThread.-wrap15(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:5417)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                   Caused by: java.lang.NumberFormatException: Invalid int: "null"
                      at java.lang.Integer.invalidInt(Integer.java:138)
                      at java.lang.Integer.parseInt(Integer.java:358)
                      at java.lang.Integer.parseInt(Integer.java:334)
                      at Data.DataBaseHandler$override.getAllContact(DataBaseHandler.java:141)
                      at Data.DataBaseHandler$override.access$dispatch(DataBaseHandler.java)
                      at Data.DataBaseHandler.getAllContact(DataBaseHandler.java)
                      at com.example.muhamad_galal.databaseintro.MainActivity$override.onCreate(MainActivity.java:29)
                      at com.example.muhamad_galal.databaseintro.MainActivity$override.access$dispatch(MainActivity.java)
                      at com.example.muhamad_galal.databaseintro.MainActivity.onCreate(MainActivity.java)
                      at android.app.Activity.performCreate(Activity.java:6237)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                      at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077) 
                      at android.app.ActivityThread.-wrap15(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5417) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

1 个答案:

答案 0 :(得分:0)

消息的含义是您已将null传递给整数的parseInt方法。按照: -

Caused by: java.lang.NumberFormatException: Invalid int: "null"

因此看起来表的第一列有空值。

您猜测,您尚未将该列定义为 rowid 的别名,因此该列未被赋予唯一的整数值。

要成为 rowid 的别名,必须将其定义为INTEGER PRIMARY KEYINTEGER PRIMARY KEY AUTOINCREMENT(不建议使用后者)。

如果你改变了: -

public List<Contact> getAllContact(){
    SQLiteDatabase db = this.getReadableDatabase();    
    List<Contact> contactList = new ArrayList<>();    
    String selectAll = "SELECT * FROM " + Util.TABLE_NAME;    
    Cursor cursor = db.rawQuery(selectAll , null);
    if (cursor.moveToFirst()){
        do {
            Contact contact = new Contact();
           // HERE is where the error come...
            try{
                if (cursor.getString(0) != null)
                 contact.setId(Integer.parseInt(cursor.getString(0)));
            }catch (Exception e){e.printStackTrace();}

            contact.setName(cursor.getString(1) );
            contact.setPhoneNumber(cursor.getString(2));
            contactList.add(contact);
        }while (cursor.moveToNext());
    }
    return contactList;
}

to(请参阅以//<<<<开头的行末尾的注释): -

public List<Contact> getAllContact(){
    SQLiteDatabase db = this.getReadableDatabase();    
    List<Contact> contactList = new ArrayList<>();    
    String selectAll = "SELECT rowid,* FROM " + Util.TABLE_NAME; //<<<< CHANGED    
    Cursor cursor = db.rawQuery(selectAll , null);
    if (cursor.moveToFirst()){
        do {
            Contact contact = new Contact();
            contact.setId(cursor.getInt(0)); //<<<< CHANGED to use getInt
            contact.setName(cursor.getString(2)); //<<<< CHANGED to skip first column
            contact.setPhoneNumber(cursor.getString(3)); //<<<< CHANGED to skip first column
            contactList.add(contact);
        }while (cursor.moveToNext());
    }
    return contactList;
}

然后我怀疑你会得到预期的结果。

  • 这会获得通常隐藏的实际 rowid 列以及所有其他列;所以在开始时有一个额外的列。
    • 请注意,这假设您尚未使用WITHOUT ROWID
    • 定义表格
  • 你真的应该将id / rowid视为long,但只要没有太多行,int就会有效。

但是,这应该只是一个临时修复。

完整/永久修复应

  1. 对第一列进行编码,以便将其定义为 rowid 的别名,例如使用CREATE TABLE you_table_name (ID INTEGER PRIMARY KEY, the_other_columns......(这假设列名称为 ID )。

  2. 通过卸载应用程序或删除应用程序的数据来删除数据库。

    1. 这假设您不需要当前数据。
  3. 更改 contact 类,以便 ID 成员 long 而不是{{1 }}

  4. 更改 int 类(contact中的getter和setter,我假设setId),以便方法使用 { {1}} 而不是getId

  5. 更改 long 类的ID成员的任何其他用途,以使用 int

  6. contact方法更改为

  7. : -

    long
    1. 删除应用程序的数据或卸载应用程序。
    2. 重新运行应用