2016-05-04 8 views
1

何らかの奇妙な理由により、別のアクティビティで作成されたデータベースから情報を引き出すことができません。私は静的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}); 
} 
} 
+0

dbを初期化した場所のコードを提供 – Alikbar

+0

実際にそのメソッドを呼び出す前に、次のアクティビティでStudentDBOpenHelperの新しいインスタンスを作成しますか?プラス、あなたは「次の活動」と言っていますが、後であなたは断片を話します:そうです、それは適切な活動か断片活動ですか? –

+0

フラグメントクラス内のデータベースをonCreateViewの前に初期化し、このようにonViewCreatedを作成しました。 StudentDBOpenHelper myDatabase; – Carlitos

答えて

2

です。

+0

を膨らませました。最初のアクティビティでデータベースにデータを挿入しました。これは、次のアクティビティでデータベースにアクセスする適切な方法ですか? – Carlitos

+1

@Carlitos Androidのデータベースは永続的です。つまり、データが保存されると、ユーザーがデータを編集/削除する(そのようなメソッドを実装している場合)か、アプリがアンインストールされるか、設定でデータが消去されるまで保存されます。 したがって、別のアクティビティで新しいDbインスタンスを作成する方法があります。 –

+0

他のアクティビティで新しいdbインスタンスを作成しようとしましたが、アクセスしようとするとデータベースが空であるということが続きます。 – Carlitos

関連する問題