使用SQLiteAssetHelper写入数据库

时间:2014-05-01 04:06:08

标签: java android database sqlite

我试图创建一个包含2个不同表的数据库,一个是可读的,一个是可写的。用户将从可读表中获取信息,并将他们的印象写入可写表(或者我希望如此)。日志类是由不同条目组成的日志。由于我希望使用SQLiteAssetHelper预先填充可读数据库。我在SQLite数据库浏览器中创建了两个表(一个可读,一个可写)。每个表的字段和字段都与下面的Java代码相同。我将.zip复制到assets / databases文件夹中。但是,当我运行应用程序时,我收到错误,说写入数据库时​​出现问题。如何使用AssetHelper写入数据库?

提前致谢!

04-30 23:23:25.454: D/memalloc(30092): ion: Unmapping buffer  base:0x536ba000 size:3768320
04-30 23:23:25.454: D/memalloc(30092): ion: Unmapping buffer  base:0x53fd9000 size:3768320
04-30 23:23:25.454: D/memalloc(30092): ion: Unmapping buffer  base:0x52823000 size:3768320
04-30 23:23:25.484: W/IInputConnectionWrapper(30092): showStatusIcon on inactive InputConnection
04-30 23:23:25.484: W/IInputConnectionWrapper(30092): InputConnection = com.android.internal.widget.EditableInputConnection@40f3d390, active client = false
04-30 23:23:25.494: D/OpenGLRenderer(30092): Flushing caches (mode 1)
04-30 23:23:33.472: D/dalvikvm(30931): GC_FOR_ALLOC freed 73K, 23% free 2943K/3807K, paused 36ms
04-30 23:23:33.482: I/dalvikvm-heap(30931): Grow heap (frag case) to 4.026MB for 1146096-byte allocation
04-30 23:23:33.542: D/dalvikvm(30931): GC_FOR_ALLOC freed 1K, 19% free 4060K/4963K, paused 15ms
04-30 23:23:33.612: D/libEGL(30931): loaded /system/lib/egl/libGLES_android.so
04-30 23:23:33.612: D/libEGL(30931): loaded /system/lib/egl/libEGL_adreno200.so
04-30 23:23:33.622: D/libEGL(30931): loaded /system/lib/egl/libGLESv1_CM_adreno200.so
04-30 23:23:33.622: D/libEGL(30931): loaded /system/lib/egl/libGLESv2_adreno200.so
04-30 23:23:33.642: I/Adreno200-EGLSUB(30931): <ConfigWindowMatch:2087>: Format RGBA_8888.
04-30 23:23:33.662: D/memalloc(30931): ion: Mapped buffer base:0x52823000 size:3768320 offset:0 fd:60
04-30 23:23:33.672: D/OpenGLRenderer(30931): Enabling debug mode 0
04-30 23:23:33.813: D/memalloc(30931): ion: Mapped buffer base:0x53122000 size:3768320 offset:0 fd:64
04-30 23:23:38.708: I/Adreno200-EGLSUB(30931): <ConfigWindowMatch:2087>: Format RGBA_8888.
04-30 23:23:38.718: D/memalloc(30931): ion: Mapped buffer base:0x536ba000 size:3768320 offset:0 fd:71
04-30 23:23:38.828: D/memalloc(30931): ion: Mapped buffer base:0x53fd9000 size:3768320 offset:0 fd:74
04-30 23:23:38.838: D/OpenGLRenderer(30931): Flushing caches (mode 0)
04-30 23:23:38.848: D/memalloc(30931): ion: Unmapping buffer  base:0x52823000 size:3768320
04-30 23:23:38.848: D/memalloc(30931): ion: Unmapping buffer  base:0x53122000 size:3768320
04-30 23:23:39.248: D/memalloc(30931): ion: Mapped buffer base:0x52823000 size:3768320 offset:0 fd:61
04-30 23:23:53.113: D/SqliteDatabaseCpp(30931): Registering sqlite logging func: /data/data/com.android.partyapp.main/databases/NewDb.sqlite
04-30 23:23:53.113: D/SqliteDatabaseCpp(30931): DB info: open db, path = /data/data/com.android.partyapp.main/databases , key = JesDf*wil, flag = 2, file size = 6144
04-30 23:23:53.113: D/SqliteDatabaseCpp(30931): DB info: path = /data/data/com.android.partyapp.main/databases , key = JesDf*wil, handle: 0x1ec29b8, type: w, r/w: (0,1), mode: truncate, disk free size: 1208 M
04-30 23:23:53.113: I/SQLiteAssetHelper(30931): successfully opened database NewDb.sqlite
04-30 23:23:53.123: I/SqliteDatabaseCpp(30931): sqlite returned: error code = 1, msg = no such table: TABLE_WRITEABLE
04-30 23:23:53.123: E/SQLiteDatabase(30931): Error inserting j_title=null j_rating=0.0 j_entry=null j_date=04/30/2014
04-30 23:23:53.123: E/SQLiteDatabase(30931): android.database.sqlite.SQLiteException: no such table: TABLE_WRITEABLE: , while compiling: INSERT INTO TABLE_WRITEABLE(j_title,j_rating,j_entry,j_date) VALUES (?,?,?,?)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:68)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:150)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:368)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:272)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:115)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1841)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1714)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at com.android.partyapp.database.PartyDbHelper.insertNewEntry(PartyDbHelper.java:88)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at com.android.partyapp.partyionaldatabaseapp.LogManager.insertLog(LogManager.java:45)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at com.android.partyapp.partyionaldatabaseapp.LogManager.startNewLog(LogManager.java:38)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at com.android.partyapp.partyionaldatabaseapp.LogFragment$1.onClick(LogFragment.java:72)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at android.view.View.performClick(View.java:3538)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at android.view.View$PerformClick.run(View.java:14319)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at android.os.Handler.handleCallback(Handler.java:608)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at android.os.Looper.loop(Looper.java:156)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at android.app.ActivityThread.main(ActivityThread.java:5045)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at java.lang.reflect.Method.invokeNative(Native Method)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at java.lang.reflect.Method.invoke(Method.java:511)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-30 23:23:53.123: E/SQLiteDatabase(30931):    at dalvik.system.NativeStart.main(Native Method)
04-30 23:23:53.163: D/memalloc(30931): ion: Mapped buffer base:0x52745000 size:196608 offset:0 fd:67
04-30 23:23:56.627: D/memalloc(30931): ion: Unmapping buffer  base:0x52745000 size:196608

和Java:

import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;

 public class PartyDbHelper extends SQLiteAssetHelper {
    //Create database itself
    private static final String DATABASE_NAME = "NewDb.sqlite";

    //Set up column titles 
    //Create 2 tables within the database
    private static final String TABLE_READABLE = "TABLE_READABLE";
    //Create an id for each column
    public static final String KEY_RID = "_id";
    public static final String KEY_NAME = "party_name";
    public static final String KEY_STATE = "party_college";
    public static final String KEY_FB = "party_fb";
    public static final String KEY_TWITTER = "party_twitter";

    private static final String TABLE_WRITEABLE = "TABLE_WRITEABLE";
    public static final String KEY_JDATE = "j_date";
    public static final String KEY_JTITLE = "j_title";
    public static final String KEY_JENTRY = "j_entry";
    public static final String KEY_JRATING = "j_rating";
    public static final String KEY_WID = "j_entry_id";

    //Version 2014.1
    private static final int DATABASE_VERSION = 1;

    public PartyDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        //OnCreate is called the first time the database is called. Otherwise we use update
    /**@Override
        //Set up database here


        public void onCreate(SQLiteDatabase db) {
            //We execute the database (db) and then set up our table
            db.execSQL("CREATE TABLE " + TABLE_READABLE + " (" + 
                    //Column name     Type of variable
                    KEY_RID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
                    KEY_NAME + " TEXT NOT NULL, " +
                    KEY_STATE + " TEXT NOT NULL, " +
                    KEY_FB + " TEXT NOT NULL, " +
                    KEY_TWITTER + " TEXT NOT NULL);"
                    ); 

            db.execSQL("CREATE TABLE " + TABLE_WRITEABLE + " (" +
                    KEY_WID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    KEY_JDATE + " INTEGER NOT NULL, " +
                    KEY_JTITLE + " TEXT NOT NULL, " +
                    KEY_JRATING + " FLOAT NOT NULL, " +
                    KEY_JENTRY + " TEXT NOT NULL);"
                    );

        }**/

        @Override
        //This is where we look to edit the table
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_READABLE);
            db.execSQL("DROP IF TABLE EXISTS " + TABLE_WRITEABLE);
            onCreate(db);
        }

        public long insertNewEntry(LogClass logClass) {
            ContentValues cv = new ContentValues();
            cv.put(KEY_JDATE, logClass.getDate());
            cv.put(KEY_JTITLE, logClass.getlTitle());
            cv.put(KEY_JRATING, logClass.getlRatingBar());
            cv.put(KEY_JENTRY, logClass.getlEntry());
            return getWritableDatabase().insert(TABLE_WRITEABLE, null, cv);
        }

        ////////////////Query Parties\\\\\\\\\\\\\\

        //Get cursor that will display entries
        public EntryCursor queryEntries() {
            Cursor wrapped = getReadableDatabase().query
                    (TABLE_WRITEABLE, null, null, null, null, null, KEY_JDATE + " asc");
            return new EntryCursor(wrapped);
        }

        /**
         * The wrapped cursor returns rows from the Log table. The getLog() method will return an
        //entire object readable instance for the current row
        */
        public static class EntryCursor extends CursorWrapper {
            public EntryCursor (Cursor c) {
                super(c);
            }
            /** 
             * Returns a readable object for the current row, or null if the current row is invalid
             */
            public LogClass getLog() {
                if (isBeforeFirst() || isAfterLast())
                    return null;
                LogClass logClass = new LogClass();
                long logClassId = getLong(getColumnIndex(KEY_WID));
                logClass.setEntryId(logClassId);

                String enteredLogDate = getString(getColumnIndex(KEY_JDATE));
                logClass.setDate((enteredLogDate));
                String enteredLogEntry = getString(getColumnIndex(KEY_JENTRY));
                logClass.setlEntry(enteredLogEntry);
                String enteredLogTitle = getString(getColumnIndex(KEY_JTITLE));
                logClass.setlTitle(enteredLogTitle);
                float enteredLogRating = getFloat(getColumnIndex(KEY_JRATING));
                logClass.setlRatingBar(enteredLogRating);

                return logClass;
            }
        }
    }

**编辑:添加代码** LogManager应该处理将LogClass对象添加到数据库中。 LogClass本身只是一系列的getter和setter。由于空间原因,我省略了这个类。

LogClass

import android.content.Context;
import android.content.SharedPreferences;

import com.android.partyapp.database.PartyDbHelper;
import com.android.partyapp.database.PartyDbHelper.EntryCursor;

public class LogManager {
    private static final String PREFS_FILE = "logs";
    private static final String PREF_CURRENT_LOG_ID = "LogManager.currentEntryId";

    private static LogManager sLogManager;
    private PartyDbHelper mHelper;
    private Context mAppContext;
    private SharedPreferences mPrefs;
    private long mCurrentEntryId;

    private String TAG1;
    private String TAG;

    //Use shared preferences to keep track of entry ID
    private LogManager(Context appContext) {
        mAppContext = appContext;
        mHelper = new PartyDbHelper(mAppContext);
        mPrefs = mAppContext.getSharedPreferences(PREFS_FILE, Context.MODE_PRIVATE);
        mCurrentEntryId = mPrefs.getLong(PREF_CURRENT_LOG_ID, -1);
    }

    public static LogManager get(Context c) {
        if (sLogManager == null) {
            sLogManager = new LogManager(c.getApplicationContext());
        }
        return sLogManager;
    }

    public LogClass startNewLog(){
        LogClass logClass = insertLog();
        return logClass;
    }

    private LogClass insertLog() {
        LogClass logClass = new LogClass();
        logClass.setEntryId(mHelper.insertNewEntry(logClass));
        return logClass;
    }

    //Goes to the SQL and finds the primitive text to input the row into a new instance of a log
    public EntryCursor queryEntries() {
        return mHelper.queryEntries();
    }

}

2 个答案:

答案 0 :(得分:0)

你的create table sql被注释掉了。它没有找到您指定的表,因为它尚未创建。

答案 1 :(得分:0)

您放置在assets文件夹中的数据库应该具有TABLE_READABLE和TABLE_WRITEABLE两个表。请确保。并查看链接以参考https://github.com/jgilfelt/android-sqlite-asset-helper