-2

ユーザーはリストを見て、オプションの 1 つ (または)LibraryFragmentをクリックします。そこから、データベースから受け取った項目から動的に作成される別のリスト ( ) を表示したいと思いました。logCat では、次のエラーが表示されます。Item1Item2GFragment

08-30 13:56:54.087: E/SqliteDatabaseCpp(22622): sqlite3_open_v2("/data/data/j.j.l.library.v11/databases/library_dev.db", &handle, 1, NULL) failed

Failed to open the database. Closing it.

コードの何が問題なのか、またはなぜこれを行っているのか誰かが知っていますか?


データベースに使用しているコードは次のとおりです。

public class DatabaseHelper {

private static String DB_PATH = "/data/data/j.j.l.library.v11/databases/";    
private static String DB_NAME = "library_dev.db";
private SQLiteDatabase myDataBase;

public DatabaseHelper(){
}

//Open the database.
public void openDatabase() throws SQLException{

    String myPath = DB_PATH + DB_NAME;
    myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}   

//Return the columns we want.
public List<String> getQueryColumn(String tableName, String[] columns){

    Cursor cursor;
    List<String> info = new ArrayList<String>();
    cursor = myDataBase.query(tableName, columns, null, null, null, null, null);

    cursor.moveToFirst();
    while(!cursor.isAfterLast()){
        info.add(cursor.getString(0));
        cursor.moveToNext();
    }
    cursor.close();
    return info;
}    

//Close the Database.
public void closeDatabase() throws SQLException{

    myDataBase.close();
}

}

データベースから動的に作成しようとしている別のリスト:

public class GFragment extends ListFragment {

private DatabaseHelper gList;
public static final String GROLE = "role";
public static final String[] ROLENAME = {"name"};


@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);

    gList = new DatabaseHelper();
    gList.openDatabase();

    List<String> values = gList.getQueryColumn(GROLE, ROLENAME);

    setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, values));
    gList.closeDatabase();

}
}

これは、データベースから動的リストを取得するための呼び出しが行われる直前に、ユーザーが見ているリストです。

public class LibraryFragment extends ListFragment{

String[] libraryList = {"Item1", "Item2"};  

@Override
public void onActivityCreated(Bundle savedInstanceState){
    super.onActivityCreated(savedInstanceState);
    setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, libraryList));
}

@Override
public void onListItemClick(ListView l, View v, int position, long id){
    //Get the position the user clicked.
    Fragment newFragment = null;
    String listPosition = libraryList[position];

    getListView().setItemChecked(position, true);

    if(listPosition.equals("Item1")){
        newFragment = new GFragment();                      
    }else if (listPosition.equals("Item2")){
        newFragment = new ITFragment();
    }

    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.myFragments, newFragment);
    transaction.addToBackStack(null);
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    transaction.commit();

}

}
4

1 に答える 1

0

これは、このデータベースを作成していないためlibrary_dev.db、空であり、NULL参照になります。その後、クロージング操作が行われます。

最初creation/upgrade/removeから拡張する必要があるクラスでデータベースのを処理する必要があります。SQLiteOpenHelper次に、このクラスを使用してデータベースを取得します。

public class MyDatabaseHelper extends SQLiteOpenHelper { // blah...database create/upgrade handling }

MyDatabaseHelper myHelper = new MyDatabaseHelper(yourContext);
SQLiteDatabase myDatabase = myHelper.getReadableDatabase(); // now you can use `myDatabase` freely

これに関する適切なガイドラインは、http ://www.vogella.com/articles/AndroidSQLite/article.htmlで参照できます。

于 2012-08-30T14:45:38.153 に答える