简体   繁体   English

使用SQLiteAssetHelper写入数据库

[英]Writing to a Database Using SQLiteAssetHelper

I'm trying to create a database with 2 different tables, one readable and one writeable. 我正在尝试创建一个包含2个不同表的数据库,一个是可读的,一个是可写的。 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. 由于我希望预先填充可读数据库,因此我使用的是SQLiteAssetHelper。 I created 2 tables in SQLite Database Browser (one readable, one writable). 我在SQLite数据库浏览器中创建了两个表(一个可读,一个可写)。 Each one has the tables and fields identical to what is in the Java code below. 每个表的字段和字段都与下面的Java代码相同。 I copied the .zip into the assets/databases folder. 我将.zip复制到assets / databases文件夹中。 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? 如何使用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: 和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. **编辑:添加代码** LogManager应该处理将LogClass对象添加到数据库中。 The LogClass itself is just a series of getters and setters. LogClass本身只是一系列的getter和setter。 I omitted that class for space reasons. 出于空间原因,我省略了该类。

LogClass 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. 你的create table sql被注释掉了。 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. 您放在assets文件夹中的数据库应该包含TABLE_READABLE和TABLE_WRITEABLE表。 Please ensure that. 请确保。 And check the link for reference https://github.com/jgilfelt/android-sqlite-asset-helper 并查看链接以获取参考https://github.com/jgilfelt/android-sqlite-asset-helper

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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