db.insert()在android中返回-1,尽管我觉得可以正确编写

db.insert()在android中返回-1,尽管我觉得可以正确编写,android,android-sqlite,Android,Android Sqlite,我已经看过无数的教程和以前提出的问题,我觉得我的代码应该可以工作。但是,每当我转到insert时,db.insert都会返回错误代码-1 数据库合同 public final class DatabaseContract { private static final String TEXT_TYPE = " TEXT not null"; private static final String TEXT_TYPE_NULL = "TEXT"; private sta

我已经看过无数的教程和以前提出的问题,我觉得我的代码应该可以工作。但是,每当我转到insert时,db.insert都会返回错误代码-1

数据库合同

public final class DatabaseContract {


private static final String TEXT_TYPE          = " TEXT not null";
private static final String TEXT_TYPE_NULL     = "TEXT";
private static final String INT_TYPE           = "INTEGER not null";
private static final String INT_TYPE_NULL           = "INTEGER";
private static final String COMMA_SEP          = ",";

// To prevent someone from accidentally instantiating the contract class,
// give it an empty constructor.
private DatabaseContract() {}

public static abstract class Client implements BaseColumns {
    public static final String TABLE_NAME       = "client";
    public static final String COLUMN_NAME_COL1 = "fullname";
    public static final String COLUMN_NAME_COL2 = "phone";
    public static final String COLUMN_NAME_COL3 = "photo";


    public static final String CREATE_TABLE = "CREATE TABLE " +
            TABLE_NAME + " (" +
            _ID + " INTEGER PRIMARY KEY autoincrement," +
            COLUMN_NAME_COL1 + TEXT_TYPE + COMMA_SEP +
            COLUMN_NAME_COL2 + INT_TYPE + COMMA_SEP +
            COLUMN_NAME_COL3 + TEXT_TYPE + " )";
    public static final String DELETE_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME;
}

public static abstract class Drink implements BaseColumns {
    public static final String TABLE_NAME       = "drink";
    public static final String COLUMN_NAME_COL1 = "name";
    public static final String COLUMN_NAME_COL2 = "desc";
    public static final String COLUMN_NAME_COL3 = "upc";
    public static final String COLUMN_NAME_COL4 = "price";


    public static final String CREATE_TABLE = "CREATE TABLE " +
            TABLE_NAME + " (" +
            _ID + " INTEGER PRIMARY KEY autoincrement," +
            COLUMN_NAME_COL1 + TEXT_TYPE + COMMA_SEP +
            COLUMN_NAME_COL2 + TEXT_TYPE_NULL + COMMA_SEP +
            COLUMN_NAME_COL3 + INT_TYPE_NULL + COMMA_SEP +
            COLUMN_NAME_COL4 + INT_TYPE +" )";
    public static final String DELETE_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME;
}
}

数据库助手

public class DatabaseHelper extends SQLiteOpenHelper {
public static final  int    DATABASE_VERSION   = 1;
public static final  String DATABASE_NAME      = "drinkpos.db";

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);

}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(DatabaseContract.Client.CREATE_TABLE);
    db.execSQL(DatabaseContract.Drink.CREATE_TABLE);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
}

主要活动

   @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    DatabaseHelper dbHelper = new DatabaseHelper(this);
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(DatabaseContract.Drink.COLUMN_NAME_COL1, "fanta");
    values.put(DatabaseContract.Drink.COLUMN_NAME_COL2, "orange");
    values.put(DatabaseContract.Drink.COLUMN_NAME_COL3, "100141166");
    values.put(DatabaseContract.Drink.COLUMN_NAME_COL4, "100");
    // Insert the new row, returning the primary key value of the new row
    long newRowId;
    newRowId = db.insert(
            DatabaseContract.Drink.TABLE_NAME,
            null,
            values);
我已尝试删除任何不必要的代码。 在运行上述代码之后,我尝试从数据库中读取数据,它告诉我没有这样的第三列(例如,对于饮料,是desc;对于客户表,是photo)

任何想法都将不胜感激

private static final String TEXT_TYPE          = " TEXT not null";
private static final String TEXT_TYPE_NULL     = "TEXT";
private static final String INT_TYPE           = "INTEGER not null";
private static final String INT_TYPE_NULL           = "INTEGER";
TEXT\u TYPE\u NULL
INT\u TYPE
INT\u TYPE\u NULL
前面缺少空格。您声明的列类似于

COLUMN_NAME_COL2 + INT_TYPE
将列名和类型连接在一起,如
descINTEGER not null
,当然不会有列
desc


解决问题后,您可以卸载应用程序以重新创建数据库。

在DatabaseContract类-public static final int database_VERSION=1中声明以下2个静态变量;公共静态最终字符串数据库\u NAME=“drinkpos.db”;然后将db version增加到2,并在onUpgrade方法中重新创建创建的表。