连接到我的SQLite数据库时出错

时间:2012-08-30 14:26:45

标签: android database sqlite

用户正在查看列表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();

}

}

1 个答案:

答案 0 :(得分: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

上参考相应的指南