我试图创建一个包含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();
}
}
答案 0 :(得分:0)
你的create table sql被注释掉了。它没有找到您指定的表,因为它尚未创建。
答案 1 :(得分:0)
您放置在assets文件夹中的数据库应该具有TABLE_READABLE和TABLE_WRITEABLE两个表。请确保。并查看链接以参考https://github.com/jgilfelt/android-sqlite-asset-helper