抱歉,由于工作,我不得不删除我之前的帖子。 。这是对我遇到的问题的更通用的修复,它没有特别引用任何东西,但更像是如何使用我给出的解决方案完成它的框架。
/// --------------------此帖最近的编辑------------------ ----------------
好的家伙和女孩们,我的语法没有错误,但我的方法并不是最聪明的。对于那些需要解决方案的人来说,我是如何正确地做到这一点的,这是用于在android的单个数据库中创建多个表(至少我做的方式。).......
好的,清除dbAdapters中嵌入的所有dbHelper类,并创建一个扩展SQLiteOpenHelper的独立dbhelper类。通过这样做,您可以使用类来访问信息,同时引用SliteOpenHelper独立的dbAdapter。下面是Stand alone helper类和我用来访问它的一个适配器的示例。
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DatabaseHelper extends SQLiteOpenHelper
{
//-----------------------------------Member Variables---------------------------
private static final String DATABASE_NAME = "databaseName";
private static final int DATABASE_VERSION = 1;
//----------------------------------------------------------------------
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
// nothing here cause not upgrading version right now
Log.w(DatabaseHelper.class.getName(),
"Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_NAME + Table1DbAdapter.DATABASE_TABLE);
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_NAME + Table2DbAdapter.DATABASE_TABLE);
onCreate(db);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(Table1DbAdapter.CREATE_TABLE_ONE);
db.execSQL(Table2DbAdapter.CREATE_TABLE_TWO);
}
}
//以及如何从访问table1的类中使用此帮助程序的一个示例(对所有其他表执行相同的方式)
public class Table1DbAdapter {
static final String DATABASE_TABLE = "table1";
public static final String KEY_TITLE = "title";
public static final String KEY_BODY = "body";
public static final String KEY_ROWID = "_id";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
static final String CREATE_TABLE_ONE =
"create table " + DATABASE_TABLE + "("
+ KEY_ROWID + " integer primary key autoincrement, "
+ KEY_TITLE + " text not null, "
+ KEY_BODY + " text not null )";
private final Context mCtx;
public Table1DbAdapter(Context ctx) {
this.mCtx = ctx;
}
// create the database
public Table1DbAdapter open() throws android.database.SQLException{
this.mDbHelper = new DatabaseHelper(mCtx);
this.mDb = mDbHelper.getWritableDatabase();
return this;
}
// create an entry
public long createEntry(String title, String body){
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_BODY, body);
return
this.mDb.insert(DATABASE_TABLE, null, initialValues);
}
// delete an Entry
public boolean deleteEntry(long rowId){
return
this.mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" +rowId, null) > 0;
}
// fetch all Entries
public Cursor fetchAllEntries(){
return this.mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE,
KEY_BODY}, null, null, null, null, null);
}
// fetch an Entry
public Cursor fetchEntry(long rowId) throws SQLException{
Cursor mCursor =
mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE,
KEY_BODY}, KEY_ROWID +"="+
rowId, null, null, null, null, null);
if (mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
// update an Entry
public boolean updateEntry(long rowId, String title, String body){
ContentValues args = new ContentValues();
args.put(KEY_TITLE, title);
args.put(KEY_BODY, body);
return
this.mDb.update(DATABASE_TABLE, args, KEY_ROWID + "="+ rowId, null)> 0;
}
// close the database
public void close(){
mDbHelper.close();
}
}
//我希望这会有所帮助....对于早些时候的删除再次感到遗憾,但这是应该如何完成的。 。 。至少在我找到更有效的方法之前
答案 0 :(得分:1)
了解SQLite语法的最佳来源是SQLite Homepage
你的语法看起来是正确的。
编辑:是的,您需要从app文件夹中删除数据库,并让应用程序为您创建一个新数据库,就像评论中建议您做的那样。因为onCreate()
方法检查数据库是否存在,如果没有,则创建一个新的。
您可以通过在Eclipse中使用DDMS来删除数据库。数据库通常存储在
中/data/data/your.applications.package/databases
答案 1 :(得分:1)
看起来您的数据库存在,但您的表(设施)却没有。
因此,永远不会调用onCreate(),因为数据库已经存在。
随后运行SELECT查询时,它会抛出异常。
我很确定如果您使用调试器并逐步执行代码,您会看到这种情况发生。
解决方案:
答案 2 :(得分:1)
好的,没有冒犯,但你的方法确实需要一些工作。那段代码是完全纠结的。
至于解释异常的原因......
在该代码中,从未创建MainDbAdapter
的实例。结果是,它的onCreate(...)
方法永远不会被调用,所以基本上你没有任何表(所有这些表,我的意思是,不仅仅缺少设施表)。
老实说,我不会将派生的SQLiteOpenHelper
嵌套到任何类型的“适配器”中。
创建一个扩展SQLiteOpenHelper
的独立类,只需在需要时创建它的实例。
摆脱“适配器”类中的嵌套DatabaseHelper
类,重新构建,查看eclipse抱怨的内容(假设您正在使用eclipse)然后通过将所有内容指向您的站点来修补它 - SQLiteOpenHelper
。