数据库中的java.lang.RuntimeException

时间:2016-06-30 13:42:19

标签: java android runtimeexception

我为我的笔记创建了一个数据库,但在运行应用程序时,我的日志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);
    }
}
}

3 个答案:

答案 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;