将另一列添加到SQLite数据库Android

时间:2016-08-09 23:22:03

标签: android sqlite

我在一个记笔记应用程序中使用SQLite数据库,它工作正常。我想为注释的标题添加另一列,这是我的新代码的结果:

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

// class to create the sqlite database
public class DBOpenHelper extends SQLiteOpenHelper {

    // database name and version
    // name needs .db
    private static final String DATABASE_NAME = "notes.db";
    private static final int DATABASE_VERSION = 1;

    // database table and columns
    // id will be primary key and content provider will expect it to have "_" in front
    public static final String TABLE_NOTES = "notes";
    public static final String NOTE_ID = "_id";
    public static final String NOTE_TITLE = "noteTitle";
    public static final String NOTE_BODY = "noteBody";
    public static final String NOTE_CREATED = "noteCreated";

    public static final String[] ALL_COLUMNS =
            {NOTE_ID, NOTE_TITLE, NOTE_BODY, NOTE_CREATED};
    // SQL to create table
    private static final String TABLE_CREATE =
            "CREATE TABLE " + TABLE_NOTES + " (" +
                    NOTE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    NOTE_TITLE + " TEXT, " +
                    NOTE_BODY + " TEXT, " +
                    NOTE_CREATED + " TEXT default CURRENT_TIMESTAMP" +
                    ")";

    // constructor
    public DBOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // called the first time this class is instantiated
    // creates database structure if it does not exist yet
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(TABLE_CREATE);
    }

    // called when database version is changed and
    // user opens app first time after database updated
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS" + TABLE_NOTES);
        onCreate(sqLiteDatabase);
    }
}

这是我的旧代码(没有太多改变)。我所做的就是为NOTE_TITLE添加一列:

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

// class to create the sqlite database
public class DBOpenHelper extends SQLiteOpenHelper {

    // database name and version
    // name needs .db
    private static final String DATABASE_NAME = "notes.db";
    private static final int DATABASE_VERSION = 1;

    // database table and columns
    // id will be primary key and content provider will expect it to have "_" in front
    public static final String TABLE_NOTES = "notes";
    public static final String NOTE_ID = "_id";
    public static final String NOTE_BODY = "noteBody";
    public static final String NOTE_CREATED = "noteCreated";

    public static final String[] ALL_COLUMNS =
            {NOTE_ID, NOTE_BODY, NOTE_CREATED};
    // SQL to create table
    private static final String TABLE_CREATE =
            "CREATE TABLE " + TABLE_NOTES + " (" +
                    NOTE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    NOTE_BODY + " TEXT, " +
                    NOTE_CREATED + " TEXT default CURRENT_TIMESTAMP" +
                    ")";

    // constructor
    public DBOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // called the first time this class is instantiated
    // creates database structure if it does not exist yet
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(TABLE_CREATE);
    }

    // called when database version is changed and
    // user opens app first time after database updated
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS" + TABLE_NOTES);
        onCreate(sqLiteDatabase);
    }
}

以下是我尝试运行时遇到的所有错误:

08-09 19:13:19.561 10539-10539/com.sample.mynote I/art: Late-enabling -Xcheck:jni 08-09 19:13:19.592 10539-10539/com.sample.mynote I/HyLog: I : openReadStream, /data/font/config/sfconfig.dat, case (2) 08-09 19:13:19.592 10539-10539/com.sample.mynote D/HyLog: D: Wrong tag (927 : loadPreData() : frameworks/base/core/jni/android/graphics/TypefaceHyFontManager.cpp) 08-09 19:13:19.592 10539-10539/com.beauty.sample.mynote I/HyLog: I : openReadStream, /data/font/config/sfconfig.dat, case (2) 08-09 19:13:19.605 10539-10539/com.beauty.sample.mynote W/System: ClassLoader referenced unknown path: /data/app/com.sample.mynote-1/lib/arm64 08-09 19:13:19.882 10539-10539/com.sample.mynote W/System: ClassLoader referenced unknown path: /data/app/com.sample.mynote-1/lib/arm64 08-09 19:13:19.997 10539-10539/com.sample.mynote W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 08-09 19:13:20.012 10539-10539/com.beauty.sample.mynote I/PhoneWindow: [generateLayout] setColorNavigationBar => color=0x ff000001 08-09 19:13:20.029 10539-10539/com.sample.mynote D/PhoneWindowEx: Ex2. SystemProperties.get result >> #ff000000 08-09 19:13:20.029 10539-10539/com.sample.mynote D/PhoneWindowEx: [PWEx][generateLayout] setNavigationBarColor2 : colors=0xff000000 08-09 19:13:20.029 10539-10539/com.sample.mynote I/PhoneWindow: [setNavigationBarColor2] color=0x ff000000 08-09 19:13:20.137 10539-10586/com.sample.mynote E/SQLiteLog: (1) no such column: noteTitle


--------- beginning of crash 08-09 19:13:20.139 10539-10586/com.sample.mynote E/AndroidRuntime: FATAL EXCEPTION: ModernAsyncTask #1
                                                                                Process: com.sample.mynote, PID: 10539
                                                                                java.lang.RuntimeException: An error occurred while executing doInBackground()
                                                                                    at android.support.v4.content.ModernAsyncTask$3.done(ModernAsyncTask.java:143)
                                                                                    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
                                                                                    at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
                                                                                    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                                    at java.lang.Thread.run(Thread.java:818)
                                                                                 Caused by: android.database.sqlite.SQLiteException: no such column: noteTitle (code 1): , while compiling: SELECT _id, noteTitle, noteBody, noteCreated FROM notes ORDER BY noteCreated DESC
                                                                                    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                                                    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:893)
                                                                                    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:504)
                                                                                    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:726)
                                                                                    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                                                                                    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
                                                                                    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
                                                                                    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1426)
                                                                                    at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1273)
                                                                                    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1144)
                                                                                    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1312)
                                                                                    at com.beauty.comp_eng.mynote.NoteProvider.query(NoteProvider.java:62)
                                                                                    at android.content.ContentProvider.query(ContentProvider.java:1017)
                                                                                    at android.content.ContentProvider$Transport.query(ContentProvider.java:238)
                                                                                    at android.content.ContentResolver.query(ContentResolver.java:498)
                                                                                    at android.support.v4.content.ContentResolverCompatJellybean.query(ContentResolverCompatJellybean.java:29)
                                                                                    at android.support.v4.content.ContentResolverCompat$ContentResolverCompatImplJB.query(ContentResolverCompat.java:57)
                                                                                    at android.support.v4.content.ContentResolverCompat.query(ContentResolverCompat.java:125)
                                                                                    at android.support.v4.content.CursorLoader.loadInBackground(CursorLoader.java:59)
                                                                                    at android.support.v4.content.CursorLoader.loadInBackground(CursorLoader.java:37)
                                                                                    at android.support.v4.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:296)
                                                                                    at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:54)
                                                                                    at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:42)
                                                                                    at android.support.v4.content.ModernAsyncTask$2.call(ModernAsyncTask.java:128)
                                                                                    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                                                                                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                                                                                    at java.lang.Thread.run(Thread.java:818)  08-09 19:13:20.153 10539-10591/com.sample.mynote D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 08-09 19:13:20.474 10539-10591/com.sample.mynote I/Adreno: QUALCOMM build        : ac1ef73, I86756fd4a8
                                                                        Build Date                       : 10/05/15
                                                                        OpenGL ES Shader Compiler Version: XE031.06.00.00
                                                                        Local Branch                     : 
                                                                        Remote Branch                    : 
                                                                        Remote Branch                    : 
                                                                        Reconstruct Branch               :  08-09 19:13:20.483 10539-10591/com.sample.mynote I/OpenGLRenderer: Initialized EGL, version 1.4 08-09 19:13:20.605 10539-10539/com.sample.mynote V/ViewRootImpl: Contents drawing finished : com.sample.mynote/com.sample.mynote.MainActivity

如何将笔记标题的列添加到此应用程序?

1 个答案:

答案 0 :(得分:2)

每次对db进行更改时,都需要增加db版本。 private static final int DATABASE_VERSION = 1;应更改为private static final int DATABASE_VERSION = 2;