Android: проблема чтения базы данных вызывает исключение - PullRequest
2 голосов
/ 30 марта 2010

У меня возникла эта проблема с базой данных Android. Я принял файл DBAdapter, пример NotepadAdv3 со страницы Google Android.

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

}

ошибка, которую я получаю от Log.e (TAG, e.toString ()) в методах retrieveKey () и storeKey ()

"нет такой таблицы: myuserkey:, при компиляции: SELECT userkey FROM myuserkey"

Ответы [ 2 ]

0 голосов
/ 30 марта 2010

Вы выскакивали версию БД, так что при обновлении запускается? В приведенном выше примере вы находитесь на версии 2, но если вы изменили схему начиная с версии 2, вам нужно снова открыть версию.

0 голосов
/ 30 марта 2010

Я думаю, вы не упомянули тег своего провайдера в AndroidManifest.xml. Проверьте его.

Вы должны упомянуть тег, как

 <provider android:name=".name of providerclass"
          android:authorities="authority path" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...