【问题标题】:SQLite Save Error NOT NULL ConstraintSQLite 保存错误 NOT NULL 约束
【发布时间】:2017-11-05 23:45:15
【问题描述】:

我的应用程序中有一个本地数据库,用于存储来自输入字段的用户配置文件。我已经使用 SQLiteOpenHelper 类创建了数据库,但是在运行我的应用程序后,出现了这个错误。我已经通过 DatabaseHelper 类,但找不到它有什么问题。我希望有人指出我的错误。谢谢。

我的数据库类文件在这里:

public class DBHelper {

private static final String DATABASE_NAME = "UsersDemo.db";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_NAME = "profileInfo";

private static final String COL_ID = "databaseId";
public static final String COL_USER_ID = "userId";
public static final String COL_FULL_NAME = "fullName";
public static final String COL_GENDER = "gender";
public static final String COL_DOB = "DOB";
public static final String COL_MOBILE_NUM = "mobileNum";
public static final String COL_OCCUPATION = "occupation";
public static final String COL_ORGANIZATION = "organization";
//private static final String COL_PROFILE_PHOTO = "profilePhoto";

private Context mCtx;

private DatabaseManager databaseManager;
private SQLiteDatabase db;

public DBHelper(Context context){
    this.mCtx = context;
    databaseManager = new DatabaseManager(mCtx);
}

public DBHelper open() throws SQLException{
    db = databaseManager.getWritableDatabase();
    return this;
}

public void close(){
    databaseManager.close();
}

public boolean saveInputField(TingTingUser user){
    SQLiteDatabase userDb = databaseManager.getWritableDatabase();
    ContentValues values = new ContentValues();

    values.put(COL_FULL_NAME, user.getDisplayName());
    values.put(COL_USER_ID, user.getUserId());
    values.put(COL_GENDER, user.getGender());
    values.put(COL_DOB, user.getDob());
    values.put(COL_MOBILE_NUM, user.getMobileNumber());
    values.put(COL_ORGANIZATION, user.getOrganization());
    values.put(COL_OCCUPATION, user.getOccupation());

    long result = userDb.insert(TABLE_NAME, null, values);
    userDb.close();

    if (result == -1){
        return false;
    } else {
        return true;
    }

}

public TingTingUser getCurrentUser(int id){
    SQLiteDatabase currDB = databaseManager.getWritableDatabase();
    Cursor cursor = currDB.query(true, TABLE_NAME, new String[]{COL_ID, COL_USER_ID, COL_FULL_NAME, COL_GENDER, COL_DOB, COL_MOBILE_NUM, COL_OCCUPATION, COL_ORGANIZATION}, COL_ID + "=?", new String[]{String.valueOf(id)}, null, null, null, null);

    if (cursor != null && cursor.moveToFirst()){
        TingTingUser user = new TingTingUser(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5), cursor.getString(6), cursor.getString(7));
        return user;
    }

    return null;

}

public void saveCameraImage(byte[] imageBytes){
    SQLiteDatabase camDb = databaseManager.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    //contentValues.put(COL_PROFILE_PHOTO, imageBytes);
    camDb.insert(TABLE_NAME, null, contentValues);
}

public void saveGalleryImage(byte[] imageBytes){
    ContentValues contentValues = new ContentValues();
    //contentValues.put(COL_PROFILE_PHOTO, imageBytes);
    db.insert(TABLE_NAME, null, contentValues);
}

public class DatabaseManager extends SQLiteOpenHelper {

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

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String db_create = "Create Table " + TABLE_NAME + " ("
                + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + COL_USER_ID + " TEXT, "
                + COL_FULL_NAME + " TEXT, "
                + COL_GENDER + " TEXT, "
                + COL_DOB + " TEXT, "
                + COL_MOBILE_NUM + " TEXT, "
                + COL_OCCUPATION + " TEXT, "
                + COL_ORGANIZATION + " TEXT, ";
                //+ COL_PROFILE_PHOTO + " BLOB NOT NULL );";
        sqLiteDatabase.execSQL(db_create);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS" + TABLE_NAME);
        onCreate(sqLiteDatabase);
    }

}

}

调用DBHelper的saveInputField()方法时MainActivity出现错误,如下图:

JsonObjectRequest otpObjectRequest = new JsonObjectRequest(Request.Method.POST, Constants.TING_VERIFY_OTP_ENDPOINT, verifyOTPObject, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Log.d("OTPDialogFragment", "OTP Verification Response is: \t" + response.toString());
                Log.d("OTPDialogFragment", "OTP Verified Successfully");

                try {
                    JSONObject verifyObject = new JSONObject(response.toString());
                    JSONObject userObject = verifyObject.getJSONObject("user");

                    userId = userObject.getString("_id");
                    Log.d(TAG, "Retrieved user id is:\t" + userId);

                    TingTingUser user = new TingTingUser();
                    user.setDisplayName(fullName);
                    user.setMobileNumber(num);
                    user.setGender(genderVal);
                    user.setDob(dob);
                    user.setOccupation("default");
                    user.setOrganization("default");
                    user.setUserId(userId);

                    if (!TextUtils.isEmpty(fullName) && !TextUtils.isEmpty(genderVal) && !TextUtils.isEmpty(dob) && !TextUtils.isEmpty(userId)){
                        if (dbHelper.saveInputField(user) == true){  // error occurs here
                            Toast.makeText(getContext(), "Saved User", Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(getContext(), "Save Failed", Toast.LENGTH_SHORT).show();  // Toast shows cos save failed, dont know why
                        }
                    }

对不起各位,我的主要活动太长了,只显示了必要的内容。

logcat 中的错误信息:

 android.database.sqlite.SQLiteException: near ",": syntax error (code 1): , while compiling: Create Table profileInfo (databaseId INTEGER PRIMARY KEY AUTOINCREMENT, userId TEXT, fullName TEXT, gender TEXT, DOB TEXT, mobileNum TEXT, occupation TEXT, organization TEXT,
                                                 at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                 at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
                                                 at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
                                                 at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                                                 at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                                                 at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
                                                 at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674)
                                                 at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1605)
                                                 at com.billionusers.tingting.db.DBHelper$DatabaseManager.onCreate(DBHelper.java:131)
                                                 at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:251)
                                                 at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
                                                 at com.billionusers.tingting.db.DBHelper.saveInputField(DBHelper.java:53)
                                                 at com.billionusers.tingting.activities.SignUpActivity$OTPDialogFragment$6.onResponse(SignUpActivity.java:466)
                                                 at com.billionusers.tingting.activities.SignUpActivity$OTPDialogFragment$6.onResponse(SignUpActivity.java:443)
                                                 at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65)
                                                 at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
                                                 at android.os.Handler.handleCallback(Handler.java:739)
                                                 at android.os.Handler.dispatchMessage(Handler.java:95)
                                                 at android.os.Looper.loop(Looper.java:135)
                                                 at android.app.ActivityThread.main(ActivityThread.java:5254)
                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                 at java.lang.reflect.Method.invoke(Method.java:372)
                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

【问题讨论】:

    标签: java android sqlite


    【解决方案1】:

    来自日志猫

    near ",": syntax error (code 1): , while compiling: Create Table profileInfo (databaseId INTEGER PRIMARY KEY AUTOINCREMENT, userId TEXT, fullName TEXT, gender TEXT, DOB TEXT, mobileNum TEXT, occupation TEXT, organization TEXT,
    

    DBHelper.onCreate

    String db_create = "Create Table " + TABLE_NAME + " ("
                + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + COL_USER_ID + " TEXT, "
                + COL_FULL_NAME + " TEXT, "
                + COL_GENDER + " TEXT, "
                + COL_DOB + " TEXT, "
                + COL_MOBILE_NUM + " TEXT, "
                + COL_OCCUPATION + " TEXT, "
                + COL_ORGANIZATION + " TEXT, ";
                //+ COL_PROFILE_PHOTO + " BLOB NOT NULL );";
        sqLiteDatabase.execSQL(db_create);
    

    您的 create 语句无效,因为您已将最后一行放入 cmets,因此它以 + COL_ORGANIZATION + " TEXT, "; 终止,这是不正确的。结尾应该是:

    + COL_ORGANIZATION + " TEXT ); ";
    

    【讨论】:

    • 谢谢。是否可以将 sqlite 数据库限制为只有一行?
    • 听不懂你的意思,能否请您改写一下?
    • 我希望创建时数据库中只有一行。告诉我怎么做?
    • “创建时数据库中的一行”是什么意思。 1)create脚本,创建数据库表,它不插入任何行,它是完全空的,你必须用insert语句插入行。 2) 一个数据库表可以包含许多,为什么要将其限制为一个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 2022-12-04
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-31
    相关资源
    最近更新 更多