代码之家  ›  专栏  ›  技术社区  ›  Kevik

sqLiteDatabase.insert()和SQLite错误代码1,Android数据库

  •  0
  • Kevik  · 技术社区  · 11 年前

    我从Logcat得到以下错误堆栈:

     SqliteDatabaseCpp(1355): sqlite returned: error code = 1
    
     msg = table my_table has no column named check_box_status,
     db=/data/data/com.example.dbtester/databases/my_database
    
     Error inserting check_box_status=1 price=210 check_box_label=testlabel
    
     table my_table has no column named check_box_status: , while compiling:
     INSERT INTO my_table(check_box_status,price,check_box_label) VALUES (?,?,?)
    

    我猜测这与下面显示的insert()方法的中间参数为null这一事实有关,

      public void insertNewRow(int checkBoxStatus, String checkBoxLabel, int price){
              ContentValues contentValues = new ContentValues();
              contentValues.put(KEY_CHECKBOX_STATUS, checkBoxStatus);
              contentValues.put(KEY_CHECKBOX_LABEL, checkBoxLabel);
              contentValues.put(KEY_PRICE, price);
              sqLiteDatabase.insert(MYDATABASE_TABLE, null, contentValues); // <---
              }
    

    我为sqLiteDatabase.insert()的中间参数值设置了null,但我得到上面显示的错误和堆栈的原因可能是这个变量不应该为null。

    根据下面显示的信息,我应该在现在为null的中间参数变量中放入什么?sqLiteDatabase.insert(MYDATABASE_TABLE,?,contentValues);

    注意,我在用于创建表的字符串中明确声明了一个主键,“ID INTEGER primary key AUTOINCREMENT”,我认为这与错误有关。

    数据库初始化代码:

        public static final String MYDATABASE_NAME = "my_database";
        public static final String MYDATABASE_TABLE = "my_table";
        public static final int MYDATABASE_VERSION = 1;
        public static final String KEY_CHECKBOX_STATUS = "check_box_status";
        public static final String KEY_CHECKBOX_LABEL = "check_box_label";
        public static final String KEY_PRICE = "price"; 
    
      //create table MY_DATABASE (ID integer primary key, Content text not null);
        private static final String SCRIPT_CREATE_DATABASE =
         "CREATE TABLE IF NOT EXISTS " + MYDATABASE_TABLE + " (" + "ID INTEGER PRIMARY KEY AUTOINCREMENT, " +  
        "KEY_CHECKBOX_STATUS INTEGER, " + "KEY_CHECKBOX_LABEL TEXT, " + " KEY_PRICE INTEGER" + ");";
    
        SQLiteDatabase sqLiteDatabase;
        SQLiteHelper sqLiteHelper;
        Context context;
    
        public Database(Context c){
              context = c;
              sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
             }
    
    3 回复  |  直到 11 年前
        1
  •  2
  •   Nermeen    11 年前

    在您创建的SQL中,您将 KEY_CHECKBOX_STATUS 作为列名而不是值( check_box_status )..这就是为什么 table my_table has no column named check_box_status

    因此创建应该是:

    private static final String SCRIPT_CREATE_DATABASE =
     "CREATE TABLE IF NOT EXISTS " + MYDATABASE_TABLE + " (" + "ID INTEGER PRIMARY KEY AUTOINCREMENT, " +  
    KEY_CHECKBOX_STATUS + " INTEGER, " + KEY_CHECKBOX_LABEL +" TEXT, " +  KEY_PRICE +" INTEGER" + ");";
    
        2
  •  2
  •   Pragnani    11 年前

    您的创建表语法是错误的,因为您正在用引号传递变量名称。 所以像这样更改您的创建表

      "CREATE TABLE IF NOT EXISTS " + MYDATABASE_TABLE + " (" + "ID INTEGER PRIMARY KEY AUTOINCREMENT, " +  
                KEY_CHECKBOX_STATUS+" INTEGER, " + KEY_CHECKBOX_LABEL+" TEXT, " +  KEY_PRICE +" INTEGER" + ");";
    
        3
  •  1
  •   Hoan Nguyen    11 年前

    改变

    private static final String SCRIPT_CREATE_DATABASE =
     "CREATE TABLE IF NOT EXISTS " + MYDATABASE_TABLE + " (" + "ID INTEGER PRIMARY KEY AUTOINCREMENT, " +  
    KEY_CHECKBOX_STATUS + " INTEGER, " + KEY_CHECKBOX_LABEL + " TEXT, " +  KEY_PRICE + " INTEGER);";