Android数据库插入错误

时间:2016-06-14 11:56:42

标签: android sqlite insert-into

我有一个用于创建和填充数据库的Java类。我还有一个活动,我从中提供要添加到数据库的信息。我有一种方法可以将数据插入到数据库中,但即使从我的观点来看它也应该可行,它仍无法正常工作。这是代码:

public class AccountDatabase extends SQLiteOpenHelper {
private final static String DB_Name="ACCOUNT_DATABASE";
private final static int DB_VERSION=1;
private final static String TABLE_NAME="ACCOUNT";
private final static String col_1="ID";
private final static String col_2="USERNAME";
private final static String col_3="PASSWORD";
private final static String col_4="RETYPED PASSWORD";
private final static String col_5="EMAIL";
private final static String col_6="PASSPHRASE";
AccountDatabase(Context context) {
    super(context, DB_Name, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE "+ TABLE_NAME+"(ID INTEGER PRIMARY KEY AUTOINCREMENT,USERNAME TEXT,PASSWORD TEXT,RETYPED PASSWORD TEXT,EMAIL TEXT,PASSPHRASE TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion){
    db.execSQL("DROP TABLE IF EXISTS"+TABLE_NAME);
    onCreate(db);
}
public boolean insertData(String username,String password,String retypedPassword,String email,String passphrase){
    SQLiteDatabase db=this.getWritableDatabase();
    ContentValues profileValues=new ContentValues();
    profileValues.put(col_2,username);
    profileValues.put(col_3,password);
    profileValues.put(col_4,retypedPassword);
    profileValues.put(col_5,email);
    profileValues.put(col_6,passphrase);
    long result=db.insert(TABLE_NAME,null,profileValues);//this produces result -1 and I don't know why
    if(result==-1)
        return false;
    else
        return true;
}

这是我从中调用方法的Java活动的代码:

public void submitAccount(View view){
    EditText info1=(EditText)(findViewById(R.id.username_edit_text));
    String message1=info1.getText().toString();
    EditText info2=(EditText)(findViewById(R.id.password_edit_text));
    String message2=info2.getText().toString();
    EditText info3=(EditText)(findViewById(R.id.retype_password_edit_text));
    String message3=info3.getText().toString();
    EditText info4=(EditText)(findViewById(R.id.email_edit_text));
    String message4=info4.getText().toString();
    EditText info5=(EditText)(findViewById(R.id.passphrase_edit_text));
    String message5=info5.getText().toString();
    if(!message1.isEmpty())
        counter++;
    if(!message2.isEmpty())
        counter++;
    if(!message3.isEmpty())
        counter++;
    if(!message4.isEmpty())
        counter++;
    if(!message5.isEmpty())
        counter++;
    if(counter==5) {
        mydb.insertData(message1,message2,message3,message4,message5);//this is where I call the method
        Toast.makeText(CreateAccountActivity.this, "Data inserted:" + message1 + "\n" + message2 + "\n" + message3 + "\n" + message4 + "\n" + message5, Toast.LENGTH_LONG).show();
        Intent send = new Intent(this, WelcomeActivity.class);
        String value = "true";
        send.putExtra(WelcomeActivity.EXTRA_MESSAGE, value);
        counter = 0;
        startActivity(send);

    }
    else{
        Intent send=new Intent(this,CreateAccountActivity.class);
        Log.i(msg,"Still in CreateAccountActivity");
        counter=0;
        startActivity(send);
    }
}

我收到以下错误,

  

SQL(查询)错误或缺少数据库。 (靠近“PASSWORD”:语法错误(代码1):,编译时:INSERT INTO ACCOUNT(EMAIL,PASSPHRASE,USERNAME,RETYPED PASSWORD,PASSWORD)VALUES(?,?,?,?,?))

3 个答案:

答案 0 :(得分:1)

private final static String col_4="RETYPED PASSWORD";

如果您希望在SQL列名称中包含空格,则需要将其放入例如: "\"double quotes\""但我不建议 - Android sqlite API与此类引用列名称的行为不一致。

相反,只需将列名称设为单个词,例如retypedPassword

  

我修复了列名,现在我收到了这个错误。引起:SQL(查询)错误或缺少数据库。 (没有这样的表:ACCOUNT(代码1):,编译时:INSERT INTO ACCOUNT(EMAIL,PASSPHRASE,RETYPEDPASSWORD,USERNAME,PASSWORD)VALUES(?,?,?,?,?))

卸载您的应用以重新创建数据库。除非您在onUpgrade()中修复丢失的空白问题,否则增加db版本将无法工作。

When is SQLiteOpenHelper onCreate() / onUpgrade() run?

答案 1 :(得分:0)

错误位于列名称RETYPED PASSWORD内的空格中。 只需为名称添加引号:'RETYPED PASSWORD'。 你可以写一下here

答案 2 :(得分:0)

你犯了一个愚蠢的错误,只需改变

的值
private final static String col_4 = "RETYPED PASSWORD";

进入

private final static String col_4 = "RETYPEDPASSWORD";

并复制并替换你的onCreate方法

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE " + TABLE_NAME + "(ID INTEGER PRIMARY KEY AUTOINCREMENT,USERNAME TEXT,PASSWORD TEXT,RETYPEDPASSWORD TEXT,EMAIL TEXT,PASSPHRASE TEXT)");
}

再次运行