2016-11-04 3 views
-3

Почему тип данных несовместим и почему вставка строки происходит как (name, _id), а не (_id, name), когда я вызываю метод createRecords?База данных Android SQLite Datatype mismatch

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. 
} 
} 

EDIT: Я изменил целочисленный тип _id к VARCHAR (255), но я все еще получаю ту же ошибку.

+0

«Я изменил целочисленный тип _id ... но я все равно получаю ту же ошибку». При изменении вашей схемы db необходимо удалить приложение и переустановить его. Или измените свою DATABASE_VERSION. –

ответ

0

Я считаю, что вы получаете тип данных несоответствующие ошибку, потому что вы создали столбец _idinteger как и вы пытаетесь вставить строку в этом столбце.

Попробуйте values.put(EMP_ID, Integer.parseInt(id)); или просто передать целое число в качестве параметра метода createRecords

я не понял последнюю часть вашего вопроса о (_id, name) и (name, _id), но если вы имеете в виду, чтобы не удерживаться внутри values, это потому, что это хэшмап.

Еще одна вещь, когда вы вызываете database.insert(EMP_TABLE, EMP_ID, values);, вам не нужно ничего пропускать в параметре nullColumnHack, если вы уверены, что values не пуст.

Смежные вопросы