我为我的笔记创建了一个数据库,但在运行应用程序时,我的日志cat中出现了错误。我并没有真正得到null,null,null,null中的null部分。 我也不太了解什么是RuntimeException错误
这是我的活动:
if container == (self.presentedViewController as UIContentContainer)
这是我的logcat:
package com.example.enxin.crystallise;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import java.util.ArrayList;
import java.util.Calendar;
public class NotebookDbAdapter {
private static final String DATABASE_NAME = "notebook.db";
private static final int DATABASE_VERSION = 1;
public static final String NOTE_TABLE = "note";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_TITLE = "title";
public static final String COLUMN_MESSAGE = "message";
public static final String COLUMN_THOUGHTS = "thoughts";
public static final String COLUMN_CATEGORY = "category";
public static final String COLUMN_DATE = "date";
private String[] allColumns = { COLUMN_ID, COLUMN_TITLE, COLUMN_MESSAGE, COLUMN_THOUGHTS,
COLUMN_CATEGORY, COLUMN_DATE};
public static final String CREATE_TABLE_NOTE = "create table " + NOTE_TABLE + " ( "
+ COLUMN_ID + " integer primary key autoincrement, "
+ COLUMN_TITLE + " text not null, "
+ COLUMN_MESSAGE + " text not null, "
+ COLUMN_THOUGHTS + " text not null, "
+ COLUMN_CATEGORY + " text not null, "
+ COLUMN_DATE + ");";
private SQLiteDatabase sqlDB;
private Context context;
private NotebookDbHelper notebookDbHelper;
public NotebookDbAdapter(Context ctx){
context = ctx;
}
public NotebookDbAdapter open() throws android.database.SQLException{
notebookDbHelper = new NotebookDbHelper(context);
sqlDB = notebookDbHelper.getWritableDatabase();
return this;
}
public void close(){
notebookDbHelper.close();
}
public Note createNote(String title, String message, String thoughts, Note.Category category){
ContentValues values = new ContentValues();
values.put(COLUMN_TITLE, title);
values.put(COLUMN_MESSAGE, message);
values.put(COLUMN_THOUGHTS, thoughts);
values.put(COLUMN_CATEGORY, category.name());
values.put(COLUMN_DATE, Calendar.getInstance().getTimeInMillis() + "");
long insertId = sqlDB.insert(NOTE_TABLE, null, values);
Cursor cursor = sqlDB.query(NOTE_TABLE,
allColumns, COLUMN_ID + " = " + insertId, null, null, null, null, null );
cursor.moveToFirst();
Note newnote = cursorToNote(cursor);
cursor.close();
return newnote;
}
public long deleteNote(long idToDelete){
return sqlDB.delete(NOTE_TABLE, COLUMN_ID + " = " + idToDelete, null);
}
public long updateNote(long idToUpdate, String newTitle, String newMessage, String newThoughts,
Note.Category newCategory){
ContentValues values = new ContentValues();
values.put(COLUMN_TITLE, newTitle);
values.put(COLUMN_MESSAGE, newMessage);
values.put(COLUMN_THOUGHTS, newThoughts);
values.put(COLUMN_CATEGORY, newCategory.name());
values.put(COLUMN_DATE, Calendar.getInstance().getTimeInMillis() + "");
return sqlDB.update(NOTE_TABLE, values, COLUMN_ID + " = " + idToUpdate, null);
}
public ArrayList<Note> getAllNotes(){
ArrayList<Note> notes = new ArrayList<Note>();
//grab all of the information in our database for the notes in it
Cursor cursor = sqlDB.query(NOTE_TABLE, allColumns, null, null, null, null, null);
for (cursor.moveToLast(); !cursor.isBeforeFirst(); cursor.moveToPrevious()){
Note note = cursorToNote(cursor);
notes.add(note);
}
cursor.close();
return notes;
}
private Note cursorToNote(Cursor cursor){
Note newNote = new Note (cursor.getString(1), cursor.getString(2),
Note.Category.valueOf(cursor.getString(3)), cursor.getLong(0), cursor.getLong(4));
return newNote;
}
private static class NotebookDbHelper extends SQLiteOpenHelper{
NotebookDbHelper(Context ctx){
super(ctx, DATABASE_NAME, null , DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db){
//create note table
db.execSQL(CREATE_TABLE_NOTE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
Log.w(NotebookDbHelper.class.getName(),
"Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
//destroys data
db.execSQL("DROP TABLE IF EXISTS " + NOTE_TABLE);
onCreate(db);
}
}
}
答案 0 :(得分:0)
**by: android.database.sqlite.SQLiteException: no such column: thoughts**
您的数据库中似乎没有名为 ideas 的列,您应该修复它。
在执行应用程序时捕获运行时异常。在您的情况下,数据库调用insert无法明确知道您的数据库中是否存在此列。
答案 1 :(得分:0)
你是否已经运行了这个应用程序的版本而没有实现思想栏?如果是这样,您可能正在尝试运行应用程序的缓存版本,删除应用程序并重新安装应正确安装包含所有列的数据库。 您可能还尝试清除应用程序上的缓存,然后再次运行它。
答案 2 :(得分:0)
所以我确实看到你正在用正确的列创建这个表..
public static final String CREATE_TABLE_NOTE = "create table " + NOTE_TABLE
...
+ COLUMN_THOUGHTS + " text not null, "
...
但是,我的假设是你不断修改数据库结构。
这里的问题是,在应用程序的任何运行中,表都将被创建,并且将被预先存储到下一次运行 - 这意味着任何数据库更改都将会出错。
如果这将是一个生产应用程序 - 将经常对数据库模式进行更改,那么我建议您研究进行数据库迁移的方法。
现在你也定义了一个DATABASE_VERSION
定义,这对于实际进行迁移非常有用。
在onUpgrade
方法中,您拥有正确的代码
DROP TABLE IF EXISTS ...
然而,你永远不会在这里实现它。
每次更改数据库模式时,还应增加DATABASE_VERSION
计数以调用表结构的迁移/重建。
TL;博士
private static final int DATABASE_VERSION = 2;