-2

用户正在查看一个列表LibraryFragment并单击其中一个选项(Item1Item2),从那里我想显示另一个列表(GFragment),它是根据从数据库接收到的项目动态创建的。在 logCat 我得到这个错误:

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 回答