Android:数据库读取问题抛出异常

时间:2010-03-30 07:26:44

标签: database android sqlite

我对android数据库有这个问题。我从谷歌android页面采用了DBAdapter文件NotepadAdv3示例。

DBAdapter.java

public class DBAdapter {
private static final String TAG = "DBAdapter";

private static final String DATABASE_NAME = "PasswordDb";
private static final String DATABASE_TABLE = "myuserdata";
private static final String DATABASE_USERKEY = "myuserkey";
private static final int DATABASE_VERSION = 2;

public static final String KEY_USERKEY = "userkey";
public static final String KEY_TITLE = "title";
public static final String KEY_DATA = "data";
public static final String KEY_ROWID = "_id";

private final Context mContext;

private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;

private static final String DB_CREATE_KEY =
    "create table " + DATABASE_USERKEY
    + " ("
    + "userkey text not null"
    +");";

private static final String DB_CREATE_DATA =
    "create table " + DATABASE_TABLE
    + " ("
    + "_id integer primary key autoincrement, "
    + "title text not null"
    + "data text"
    +");";

private static class DatabaseHelper extends SQLiteOpenHelper {
    DatabaseHelper(Context context) 
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
        public void onCreate(SQLiteDatabase db) 
    {
        db.execSQL(DB_CREATE_KEY);
        db.execSQL(DB_CREATE_DATA);
    }

    @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, 
        int newVersion) 
    {
        Log.w(TAG, "Upgrading database from version " + oldVersion 
            + " to "
            + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS myuserkey");
        db.execSQL("DROP TABLE IF EXISTS myuserdata");            
        onCreate(db);
    }
}

public DBAdapter(Context ctx)
{
    this.mContext = ctx;
}

public DBAdapter Open() throws SQLException{    
    try {
        mDbHelper = new DatabaseHelper(mContext); 
    }
    catch(Exception e){
        Log.e(TAG, e.toString());
    }
    mDb = mDbHelper.getWritableDatabase();
    return this;
}

public void close(){
    mDbHelper.close();
}

public Long storeKey(String userKey){
    ContentValues initialValues = new ContentValues();

    initialValues.put(KEY_USERKEY, userKey);
    try {
        mDb.delete(DATABASE_USERKEY, "1=1", null);
    }
    catch(Exception e)
    {
        Log.e(TAG, e.toString());
    }
    return mDb.insert(DATABASE_USERKEY, null, initialValues);
}

public String retrieveKey() {   
    final Cursor c;
    try {
        c = mDb.query(DATABASE_USERKEY, new String[] {
            KEY_USERKEY}, 
                null, 
                null, 
                null, 
                null, 
                null);
    }catch(Exception e){
        Log.e(TAG, e.toString());
        return "";
    }

    if(c.moveToFirst()){
        return c.getString(0);
    }
    else{
        Log.d(TAG, "UserKey Empty");
    }
    return "";
}
//not including any function related to "myuserdata" table

}

Class1.java

{
mUserKey = mDbHelper.retrieveKey();
mDbHelper.storeKey(Key);

}

我收到的错误来自于方法retrieveKey()和storeKey()

中的Log.e(TAG,e.toString())
  

“没有这样的表:myuserkey :,编译时:SELECT userkey FROM myuserkey”

2 个答案:

答案 0 :(得分:0)

我认为你没有在AndroidManifest.xml中提及你的提供者标签。检查它。

你必须提到像

这样的标签
 <provider android:name=".name of providerclass"
          android:authorities="authority path" />

答案 1 :(得分:0)

您是否弹出了DB版本,因此onUpgrade会触发?您在上面的示例中处于版本2,但如果您从版本2更改了架构,则需要再次弹出版本。