何らかの奇妙な理由により、別のアクティビティで作成されたデータベースから情報を引き出すことができません。私は静的arraylistと同じ問題がありました。データベースを使う方がはるかに簡単だと思っていましたが、クラッシュしています。私のDBインスタンスは、情報を引き出す前にそれを呼び出したとしても、次のアクティビティでは常にnullです。ここに私の関数は、関数自体はonCreateViewとonViewCreatedの外に置かれたがonViewCreatedに呼び出されたフラグメントのクラスに別のアクティビティで1つのアクティビティで作成されたデータベースへのアクセス
private void populateListView(){
Cursor cursor = myDatabase.getAllData();
String[] fromfieldNames = new String[]{StudentDBOpenHelper.KEY_ID,StudentDBOpenHelper.ITEM_NAME_COLUMN};
int[] toViewIDs = new int[] {R.id.textView_itemNumber,R.id.textView_itemName};
SimpleCursorAdapter myCursorAdapter;
myCursorAdapter = new SimpleCursorAdapter(getActivity().getBaseContext(),
R.layout.individualview,cursor,fromfieldNames,toViewIDs,0);
ListView myList = (ListView) getActivity().findViewById(R.id.courseListXML);
myList.setAdapter(myCursorAdapter);
}//USed to populate list view
です。
StudentDBOpenHelper myDatabase= new StudentDBOpenHelper(this);
が、それは断片だ場合、それは、アクティビティの場合は、引数としてgetContext()
をthis
を使用します。ここでは
は私のデータベースのヘルパークラスは、データベースを初期化する適切な方法は以下の通りである
public class StudentDBOpenHelper extends SQLiteOpenHelper {
public static final String KEY_ID = "_id";
public static final String ITEM_NAME_COLUMN = "ITEM_NAME_COLUMN";
public static final String ITEM_CATEGORY_COLUMN = "ITEM_CATEGORY_COLUMN";
public static final String ITEM_GRADE_COLUMN = "ITEM_GRADE_COLUMN";
public static final String DATABASE_NAME = "myItemDatabase.db";
public static final String DATABASE_TABLE = "ItemInfo";
public static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE ="create table " + DATABASE_TABLE + " (" +
KEY_ID + " integer primary key autoincrement, " +
ITEM_NAME_COLUMN + " text, " +
ITEM_CATEGORY_COLUMN + " text, "
+ITEM_GRADE_COLUMN + " integer);";
/*
public StudentDBOpenHelper(Context context,String name,
SQLiteDatabase.CursorFactory factory,int version) {
super(context,name,factory,version);
}
*/
public StudentDBOpenHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL((DATABASE_CREATE));
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w("TaskDBAdapter", "Upgrading from version" +
oldVersion + ",which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS" + DATABASE_TABLE);
onCreate(db);
}
public boolean insertData(String firstname,String lastname,String credits){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues(); //instance of class
contentValues.put(ITEM_NAME_COLUMN,firstname);//2 parameters(Column name in which you
//you want to insert data
// and second is the value itself
contentValues.put(ITEM_CATEGORY_COLUMN, lastname);
contentValues.put(ITEM_GRADE_COLUMN, credits);
long result = db.insert(DATABASE_TABLE,null,contentValues);
if(result == -1) {
return false;
}
else {
return true;
}
}//ends insertData functin
public Cursor getAllData(){
SQLiteDatabase db = this.getWritableDatabase();
Cursor result = db.rawQuery("select * from " + DATABASE_TABLE,null);
return result;
}//ends cursor
public boolean updateData(String id,String firstname,String lastname,String credits){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(KEY_ID,id);
contentValues.put(ITEM_NAME_COLUMN,firstname);//2 parameters(Column name in which you
//you want to insert data
// and second is the value itself
contentValues.put(ITEM_CATEGORY_COLUMN, lastname);
contentValues.put(ITEM_GRADE_COLUMN, credits);
db.update(DATABASE_TABLE,contentValues,"_id = ?",new String[]{id});
return true;
}
public Integer deleteData(String id){
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(DATABASE_TABLE,"_id = ?",new String[] {id});
}
}
dbを初期化した場所のコードを提供 – Alikbar
実際にそのメソッドを呼び出す前に、次のアクティビティでStudentDBOpenHelperの新しいインスタンスを作成しますか?プラス、あなたは「次の活動」と言っていますが、後であなたは断片を話します:そうです、それは適切な活動か断片活動ですか? –
フラグメントクラス内のデータベースをonCreateViewの前に初期化し、このようにonViewCreatedを作成しました。 StudentDBOpenHelper myDatabase; – Carlitos