2

内部SQLiteデータベース(Android)から読み込もうとすると問題が発生します。

これはローカルデータベースの私のコードです:

public class LocalDatabase extends SQLiteOpenHelper{

static final String DATABASE_NAME = "database";
static final int DATABASE_VER = 2;

static final String PROFILES_TABLE_NAME = "profiles";
static final String KEY_ID = "node_id";
static final String KEY_USERID = "user_id";
static final String KEY_EMAIL = "email";
static final String KEY_FIRSTNAME = "firstname";
static final String KEY_LASTNAME = "lastname";
static final String KEY_STUDY = "study";
static final String KEY_PROFESSION = "profession";
static final String KEY_KNOWS = "knows";
static final String KEY_LOCATION = "location";
static final String KEY_STATUS = "status";
static final String KEY_POINTS = "points";
static final String KEY_GENDER = "gender";
static final String KEY_DOB = "dob";
static final String KEY_CREATED = "created";

public LocalDatabase(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VER);

}

@Override
public void onCreate(SQLiteDatabase db) {

    String CreateProfileTable = "CREATE TABLE " + PROFILES_TABLE_NAME + "(" +
                                KEY_ID + " INTEGER PRIMARY KEY," +
                                KEY_USERID + " TEXT," +
                                KEY_EMAIL + " TEXT," +
                                KEY_FIRSTNAME + " TEXT," +
                                KEY_LASTNAME + " TEXT," +
                                KEY_STUDY + " TEXT," + 
                                KEY_PROFESSION + " TEXT," +
                                KEY_KNOWS + " TEXT," +
                                KEY_LOCATION + " TEXT," +
                                KEY_STATUS + " TEXT," +
                                KEY_POINTS + " INTEGER," +
                                KEY_GENDER + " TEXT," +
                                KEY_DOB + " TEXT," +
                                KEY_CREATED + "TEXT)";

    db.execSQL(CreateProfileTable);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    db.execSQL("DROP TABLE IF EXISTS " + PROFILES_TABLE_NAME);

    onCreate(db);

}

public void addUserProfile(String userID, String email, String firstname, String lastname, String study, String profession, String knows,
        String location, String status, int points, String gender, String DOB, String created){

    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues params = new ContentValues();

    params.put(KEY_USERID, userID);
    params.put(KEY_EMAIL, email);
    params.put(KEY_FIRSTNAME, firstname);
    params.put(KEY_LASTNAME, lastname);
    params.put(KEY_STUDY, study);
    params.put(KEY_PROFESSION, profession);
    params.put(KEY_KNOWS, knows);
    params.put(KEY_LOCATION, location);
    params.put(KEY_STATUS, status);
    params.put(KEY_POINTS, points);
    params.put(KEY_GENDER, gender);
    params.put(KEY_DOB, DOB);
    params.put(KEY_CREATED, created);

    db.insert(PROFILES_TABLE_NAME, null, params);
    db.close();


}

public ContentValues getUserProfile(){

    String query = "SELECT * FROM " + PROFILES_TABLE_NAME;
    ContentValues userProfile = new ContentValues();

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor c = db.rawQuery(query, null);

    c.moveToFirst();

    if(c.getCount()>0){

        userProfile.put(KEY_USERID, c.getString(1));
        userProfile.put(KEY_EMAIL, c.getString(2));
        userProfile.put(KEY_FIRSTNAME, c.getString(3));
        userProfile.put(KEY_LASTNAME, c.getString(4));
        userProfile.put(KEY_STUDY, c.getString(5));
        userProfile.put(KEY_PROFESSION, c.getString(6));
        userProfile.put(KEY_KNOWS, c.getString(7));
        userProfile.put(KEY_LOCATION, c.getString(8));
        userProfile.put(KEY_STATUS, c.getString(9));
        userProfile.put(KEY_POINTS, c.getString(10));
        userProfile.put(KEY_GENDER, c.getString(11));
        userProfile.put(KEY_DOB, c.getString(12));
        userProfile.put(KEY_CREATED, c.getString(13));

    }

    c.close();
    db.close();

    return userProfile;

}

}

問題は、(getUserProfile)を使用してデータをデータベースに挿入した後、user_idとemailを除くすべてのフィールドがnullである場合、addUserProfileでparams変数をチェックして取得していることです。正しい値

誰かが私が間違っていることを私に説明できますか?

4

2 に答える 2

0

私の推測では、最初にいくつかの値を入力し(おそらくユーザーIDと電子メールフィールドに対してのみ)、後でアプリのデータをクリアしなかったため、データベースが再構築されます(そしてデータベースに以前に入力した値を引き続き保持します)。この場合、新しい値を入力した場合でもContentValues、結果Cursor cの最初のデータ行に対してのみオブジェクト(結果を含む)を作成します(実行しますc.moveToFirst();)。最初の値は、ユーザーIDと電子メールのみを持ち、null他のすべての値を取得する値です。

また、SQL作成文字列CreateProfileTableにタイプミスがあります。次のようになります。

...KEY_CREATED + " TEXT)";

上記のように文字列を変更してからCreateProfileTable、アプリをアンインストールして再インストールします。

于 2012-05-20T09:56:08.270 に答える
0

あなたは単一のスペースを逃しました。 KEY_CREATED + "TEXT)";する必要がありますKEY_CREATED + " TEXT)";

テストアクティビティを使用してすべてのコードをEclipseに入れ、正常に動作させることができました。

私はそれをテストするために私のアクティビティに次のコードを入れました(adbを使用して上記のタイプミスによって引き起こされた悪いテーブルを持つデータベースを削除した後)そしてすべてが期待どおりに機能します。

    LocalDatabase db = new LocalDatabase(this);
    db.addUserProfile("01", "email", "firstname", "lastname", "study",
            "profession", "knows", "location", "status", 1,
            "gender", "DOB", "created");

    ContentValues cv = new ContentValues();

    cv = db.getUserProfile();

cvには期待値が含まれています。それでも問題が解決しない場合はお知らせください。

古いデータベースの削除で問題が発生した場合DATABASE_VERは、LocalDatabaseクラスのバージョン番号を上げてみてください。

于 2012-05-20T10:13:29.277 に答える