Android数据库SQLite数据类型不匹配

时间:2016-11-04 20:26:34

标签: android database sqlite android-sqlite

为什么数据类型不匹配,为什么在调用createRecords方法时,行的插入是(name,_id)而不是(_id,name)?

package com.caldroidsample;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import static android.R.attr.text;
import static android.R.id.primary;
import static com.caldroidsample.R.id.email;



public class MyDatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "DBName";

    private static final int DATABASE_VERSION = 2;

// Database creation sql statement
    private static final String DATABASE_CREATE = "create table MyEmployees( _id integer primary key, name varchar(255) not null);";

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

    // Method is called during creation of the database
    @Override
    public void onCreate(SQLiteDatabase database) {
        database.execSQL(DATABASE_CREATE);
    }

// Method is called during an upgrade of the database,
@Override
public void onUpgrade(SQLiteDatabase database,int oldVersion,int newVersion){
    Log.w(MyDatabaseHelper.class.getName(),
            "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
    database.execSQL("DROP TABLE IF EXISTS MyEmployees");
    onCreate(database);
}
}

这是MyDB.java类

package com.caldroidsample;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;



public class MyDB{

private MyDatabaseHelper dbHelper;

public SQLiteDatabase database;

public final static String EMP_TABLE="MyEmployees"; // name of table

public final static String EMP_ID="_id"; // id value for employee
public final static String EMP_NAME="name";  // name of employee
public final static String EMP_EMAIL="email"; // email of employee
public final static String EMP_ADDRESS="address";
public final static String EMP_GENDER="gender";
/**
 *
 * @param context
 */
public MyDB(Context context){
    dbHelper = new MyDatabaseHelper(context);
    database = dbHelper.getWritableDatabase();
}


public long createRecords(String id, String name){
    ContentValues values = new ContentValues();

    values.put(EMP_NAME, name);
    values.put(EMP_ID, id);



    return database.insert(EMP_TABLE, EMP_ID, values);
}

public Cursor selectRecords() {
    String[] cols = new String[] {EMP_ID, EMP_NAME};
    Cursor mCursor = database.query(true, EMP_TABLE,cols,null
            , null, null, null, null, null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor; // iterate to get each value.
}
}

编辑:我将_id的整数类型更改为varchar(255),但我仍然得到相同的错误。

1 个答案:

答案 0 :(得分:0)

我相信您收到数据类型不匹配错误,因为您已将列_id创建为integer,并且您正尝试在该列中插入字符串。

尝试values.put(EMP_ID, Integer.parseInt(id));或只是将整数作为参数传递给createRecords方法

我不理解您关于(_id, name)(name, _id)的问题的最后部分,但如果您指的是未在values内保留订单,那是因为它是HashMap中。

还有一件事,当您调用database.insert(EMP_TABLE, EMP_ID, values);时,如果您确定nullColumnHack不为空,则不需要在values参数中传递任何内容。