Java 使用SQLiteAssetHelper写入数据库

Java 使用SQLiteAssetHelper写入数据库,java,android,database,sqlite,Java,Android,Database,Sqlite,我试图创建一个包含两个不同表的数据库,一个是可读的,一个是可写的。用户将从可读表中获取信息,并将其印象写入可写表(我希望如此)。Log类是由不同条目组成的日志。因为我想预先填充可读数据库,所以我使用SQLiteAssetHelper。我在SQLite数据库浏览器中创建了两个表(一个可读,一个可写)。每个表和字段与下面的Java代码中的表和字段相同。我将.zip复制到资产/数据库文件夹中。但是,当我运行应用程序时,我会收到错误消息,表示写入数据库时出现问题。如何使用AssetPer写入数据库 提前

我试图创建一个包含两个不同表的数据库,一个是可读的,一个是可写的。用户将从可读表中获取信息,并将其印象写入可写表(我希望如此)。Log类是由不同条目组成的日志。因为我想预先填充可读数据库,所以我使用SQLiteAssetHelper。我在SQLite数据库浏览器中创建了两个表(一个可读,一个可写)。每个表和字段与下面的Java代码中的表和字段相同。我将.zip复制到资产/数据库文件夹中。但是,当我运行应用程序时,我会收到错误消息,表示写入数据库时出现问题。如何使用AssetPer写入数据库

提前谢谢

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
**编辑:添加代码** LogManager应该负责将LogClass对象添加到数据库中。LogClass本身只是一系列的getter和setter。由于篇幅的原因,我省略了那节课

对数级

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

}

您的创建表sql已被注释掉。它找不到您指定的表,因为尚未创建该表。

您放置在assets文件夹中的db应同时具有table\u READABLE和table\u WRITEABLE。请确保。并检查链接以供参考

您还需要编写创建查询..发布您的完整代码。这段代码不完整,我在SQLite数据库浏览器中创建了一个数据库,其中包含两个表TABLE_READABLE和TABLE_WRITEABLE(拼写如下)。当我取消对create table sql的注释时,我得到一个错误,它覆盖了AssetPer的final方法。示例代码仅描述使用getReadableDatabase()方法的只读数据库。有什么想法吗?
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();
    }

}