0

DatabaseHelper クラスと DatabaseAdapter クラスがあります。複数のアクティビティからデータを選択しようとすると、空のデータベースが表示されます。私は何を間違っていますか?データベース アダプタを呼び出して現在のアクティビティをコンテキストとして渡しているときに、データベースの読み取りまたは書き込みを行っています。

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "MySampleDatabase";
    private static final int DATABASE_VERSION = 15;
    private final Context context;

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.context = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        AssetManager manager = context.getResources().getAssets();
        InputStream is;
        try {
            is = manager.open("SQLStatements");
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            StringBuffer sb = new StringBuffer();
            String line;
            while((line = reader.readLine()) != null){
                sb.append(line);
            }
            String[] queries = (new String(sb)).split(";");
            is.close();
            for(int i = 0; i < queries.length; i++){
                db.execSQL(queries[i]);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS UserDrugs");
        db.execSQL("DROP TABLE IF EXISTS UserDrugsUsages");
        onCreate(db);
    }
}
public class DatabaseUserDrugsUsagesAdapter {
    public static final String KEY_USER_DRUG_ID = "UserDrugID";
    public static final String KEY_PACKAGE_ID = "PackageID";
    public static final String KEY_TIME_TO_USE = "TimeToUse";
    public static final String KEY_USED = "Used";
    public static final String KEY_PACKAGE_NAME = "PackageName";
    private static final String DATABASE_TABLE = "UserDrugsUsages";
    private Context context;
    private SQLiteDatabase database;
    private DatabaseHelper dbHelper;

    public DatabaseUserDrugsUsagesAdapter(Context context) {
        this.context = context;
    }

    public DatabaseUserDrugsUsagesAdapter open() throws SQLException {
        dbHelper = new DatabaseHelper(context);
        database = dbHelper.getWritableDatabase();
        return this;
    }

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

    public void clearDatabaseTable(){
        database.execSQL("DELETE FROM " + DATABASE_TABLE);
    }

    public Cursor selectUserDrugUsagesByDate(String date){
        return database.query(DATABASE_TABLE, new String[] {
                KEY_USER_DRUG_ID,
                KEY_PACKAGE_ID,
                KEY_TIME_TO_USE,
                KEY_USED,
                KEY_PACKAGE_NAME}, "TimeToUse like '" + date + "%'", null, null, null, null);
    }

    public long writeUserDrugUsage(int userDrugId, int packageId, String timeToUse, boolean used, String packageName) {
        ContentValues initialValues = createContentValues(userDrugId, packageId, timeToUse, used, packageName);

        return database.insert(DATABASE_TABLE, null, initialValues);
    }

    private ContentValues createContentValues(int userDrugId, int packageId, String timeToUse, boolean used, 
            String packageName) {

        ContentValues values = new ContentValues();
        values.put(KEY_USER_DRUG_ID, userDrugId);
        values.put(KEY_PACKAGE_ID, packageId);
        values.put(KEY_TIME_TO_USE, timeToUse);
        values.put(KEY_USED, used);
        values.put(KEY_PACKAGE_NAME, packageName);

        return values;
    }
}

編集: select 関数を呼び出すコードがあります。

Cursor c = null;
String name = null;
DatabaseUserDrugsUsagesAdapter db = new DatabaseUserDrugsUsagesAdapter(context);
db.open();
c = db.selectDrugNameById(id);
db.close();

if(c != null && c.getCount() > 0){
    c.moveToFirst();
    name = c.getString(4);
}
c.close();
4

1 に答える 1

1

これは、カーソルを操作する前にデータベースを閉じたためです。

実際、カーソルはデータベースリソースから作成されたリスト/ポインタのようなものです。

私はあなたのコードを変更しました、そしてそれはうまくいくでしょうそれを試してみてください

Cursor c = null;
String name = null;
DatabaseUserDrugsUsagesAdapter db = new DatabaseUserDrugsUsagesAdapter(context);
db.open();
c = db.selectDrugNameById(id);

if(c != null && c.getCount() > 0){
     c.moveToFirst();
     name = c.getString(4);
        }
    c.close();
    db.close();
于 2012-05-11T05:55:25.497 に答える