Android中的SQLite和NullPointer

时间:2011-07-23 08:13:21

标签: android sqlite

我想在我的android应用程序中使用sqlite数据库。第一个问题,我是否需要有一个root设备?!如果我在我的Galaxy S上尝试adb shell sqlite3,它将返回“not found”错误。此外,当我尝试“ls / data /”时,我收到“No permission”错误。

第二个问题,NullPointer本身。

07-23 10:58:17.546: ERROR/AndroidRuntime(12815): Caused by: java.lang.NullPointerException
07-23 10:58:17.546: ERROR/AndroidRuntime(12815):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
07-23 10:58:17.546: ERROR/AndroidRuntime(12815):     at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:98)
07-23 10:58:17.546: ERROR/AndroidRuntime(12815):     at com.gpachov.priorityqueue.database.Database.getAllRecords(Database.java:24)
07-23 10:58:17.546: ERROR/AndroidRuntime(12815):     at com.gpachov.priorityqueue.database.DatabaseAdapter.<init>(DatabaseAdapter.java:21)
07-23 10:58:17.546: ERROR/AndroidRuntime(12815):     at com.gpachov.priorityqueue.PriorityQueueActivity.<init>(PriorityQueueActivity.java:20)

在尝试访问数据库时,它会在Context本身中发生。

这是我的代码。

public class DatabaseHelper extends SQLiteOpenHelper {


    private final static String DATABASE_NAME="queue";

    private final static  int DATABASE_VERSION = 1;

    public DatabaseHelper(Context context){
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(ItemTable.CREATE_STRING);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //nothing for now
    }

}

导致类的更重要的空指针:

public class Database {

    private DatabaseHelper mDatabaseHelper;

    public Database(Context context) {
        mDatabaseHelper = new DatabaseHelper(context);
    }

     List<Item> getAllRecords() {
        final SQLiteDatabase database = mDatabaseHelper.getReadableDatabase();

................. 它在getAllRecords()的第一行吹着NPE。

哦,是的,这是我的创建字符串:

public static final String CREATE_STRING = "create table items (id integer primary key autoincrement, "+ "title text not null, description text not null, priority integer not null)";

2 个答案:

答案 0 :(得分:1)

解决!一个明显而荒谬的错误,虽然从我发布的文字中绝对不可能看到。

我出于某种原因在活动中的onCreate()语句之前实例化了我的适配器。意味着下面传递的上下文不是null,但还没有“准备好”。因此,对适配器或辅助函数进行处理会收到null-contexts或stuff,但是前面的调用带有未准备的上下文会导致未设置的字段和深入的空指针。

感谢所有人试图抓住这一个,但由于我没有发布活动代码,因此除了我自己以外,它几乎可以从其他角度看待。对不起。

答案 1 :(得分:0)

回答第一个问题:不,你不需要有根设备。

关于:adb shell sqlite3你想在这里完成什么?它如图所示没有意义。

关于“不许可”:是的,这是正常的。您无法在像galaxy s这样的真实设备上访问属于app的文件(尽管在模拟器上完全可以)。

第二个问题:显然mDatabaseHelpernull,当您在mDatabaseHelper.getReadableDatabase();中致电getAllRecords()时,会导致NPE。你有Database班的另一个构造函数吗?就像没有初始化mDatabaseHelper的那个?