2013-07-26 1 views
0

Я создал базу данных с использованием SQLite, я, кажется, правильно создал базу данных, пробелы и все, но когда я запускаю приложение, я получаю исключение: он не может найти идентификатор столбца: _id "SQLite Exception no column id найдено Android

Просмотрите мой код и дайте мне знать, что я делаю неправильно.

public static final String KEY_ROW_ID = "_id"; 
public static final String KEY_NAME = "persons_name"; 
public static final String RATE = "rate_it"; 

private static final String DATABASE_NAME = "iDRateIt"; 
private static final String DATABASE_TABLE = "tblPeople"; 
private static final int DATABASE_VERSION = 1; 

private dbHelper ourHelper; 
private final Context ourContext; 
private SQLiteDatabase ourDatabase; 

private static class dbHelper extends SQLiteOpenHelper { 

    public dbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
       KEY_ROW_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       KEY_NAME + " TEXT NOT NULL, " + 
       RATE + " TEXT NOT NULL);" 

       ); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
     onCreate(db); 
    } 

} 

//Constructor 
public RateIt (Context c) { 
    ourContext = c; 
} 

public RateIt open() throws SQLException 
{ 
    ourHelper = new dbHelper(ourContext); 
    ourDatabase = ourHelper.getWritableDatabase(); 
    return this; 
} 
//Close Database 
public void close() 
{ 
    ourHelper.close(); 
} 

//Insert Method 
public long createEntry(String name, String rate) { 
    // TODO Auto-generated method stub 
    ContentValues cv = new ContentValues(); 

    cv.put(KEY_NAME, name); 
    cv.put(RATE, rate); 
    return ourDatabase.insert(DATABASE_TABLE, null, cv); 


} 

public String getData() { 
    // TODO Auto-generated method stub 
    String[] columns = new String[]{ KEY_ROW_ID, KEY_NAME, RATE}; 
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); 

    String result = ""; 

    int iRow = c.getColumnIndex(KEY_ROW_ID); 
    int iName = c.getColumnIndex(KEY_NAME); 
    int iRate = c.getColumnIndex(RATE); 

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) 
    { 
     result = result + c.getString(iRow) + " " + c.getString(iName) 
       + " " + c.getString(iRate) + "\n"; 

    } 

    return result; 

} 

}

+0

введите код, из которого вы вызываете метод createEntry и getData –

ответ

0

Похоже, что проблема с

c.getString(iRow) 

из кода столбец _id определен в качестве целого числа

db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
      KEY_ROW_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 

Вам нужно будет обработать это целое число

int iRow = (c.getLong (c.getColumnIndex (KEY_ROW_ID))); или

int iRow = (c.getInteger(c.getColumnIndex(KEY_ROW_ID))); 

Надеюсь, это поможет.

Кроме того, вы определили Оценить

RATE + " TEXT NOT NULL 

как текстовое поле, если вашим делать это только для тестовых целей хорошо, но дизайн хорошей базы данных будет определять это как числовое поле какого-либо типа, т.е. Integer, Длинный.

Отличный день.

0

Вы уверены, что его создание это правильно? Поскольку

db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
     KEY_ROW_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
     KEY_NAME + " TEXT NOT NULL, " + 
     RATE + " TEXT NOT NULL);" 

, как представляется, имеют паразитную точку с запятой в А.Т., так и должно быть:

db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
     KEY_ROW_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
     KEY_NAME + " TEXT NOT NULL, " + 
     RATE + " TEXT NOT NULL)" 
+0

Нет, точка с запятой не является блуждающей. Он создал базу данных успешно, потому что мой запрос на вставку работает, но я выяснил эту проблему, мне пришлось перезапустить эмулятор и удалить приложение, а затем снова запустить. Спасибо за вход! – SalceCodec

+0

О, я рад, что ты заработал. Это замечательные новости! – HalR

+0

Здесь вы должны ответить здесь, чтобы другие могли, возможно, сохранить некоторую боль из того, что вы узнали. Это прекрасно, чтобы ответить на ваш собственный вопрос. – HalR