简体   繁体   中英

Writing to a Database Using SQLiteAssetHelper

I'm trying to create a database with 2 different tables, one readable and one writeable. Users will get information from the readable table and will write their impressions into the writable table (or so I hope). The Log Class is a logbook consisting of different entries. Since I want the readable db to be pre-populated I'm using SQLiteAssetHelper. I created 2 tables in SQLite Database Browser (one readable, one writable). Each one has the tables and fields identical to what is in the Java code below. I copied the .zip into the assets/databases folder. However, when I run the application I get errors saying that there are problems writing to the database. How do I write to a database using the AssetHelper?

Thanks in advance!

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

And the 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;
            }
        }
    }

**Edit: Added Code ** The LogManager is supposed to deal with adding LogClass objects into the database. The LogClass itself is just a series of getters and setters. I omitted that class for space reasons.

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();
    }

}

Your create table sql is commented out. It's not finding the table you specified because it hasn't been created yet.

The db you have placed in the assets folder should have both tables TABLE_READABLE and TABLE_WRITEABLE. Please ensure that. And check the link for reference https://github.com/jgilfelt/android-sqlite-asset-helper

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM