SQLite и NullPointer в Android - PullRequest
       1

SQLite и NullPointer в Android

0 голосов
/ 23 июля 2011

Я хотел бы использовать базу данных sqlite для своего приложения для Android. Первый вопрос, нужно ли мне иметь рутованное устройство ?!Если я попробую adb shell sqlite3 на моем Galaxy S, он вернет ошибку «not found».Кроме того, когда я пытаюсь "ls / data /", я получаю ошибку "Нет разрешения".

Второй вопрос, сам 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)

Это происходит в самом контексте при попыткедля доступа к базе данных.

Вот мой код.

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();

................. Он дует с NPE в первой строке getAllRecords().

О да, и вот моя строка создания:

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 ]

1 голос
/ 23 июля 2011

Решено! Очевидная и нелепая ошибка, хотя совершенно невозможно увидеть из текста, который я разместил.

Я по какой-то причине создал экземпляр моего адаптера перед оператором onCreate () в действии. То есть контекст, переданный ниже, не был нулевым, но еще не «готов». Поэтому ни адаптер, ни помощник не получили нулевой контекст или что-то еще, но более ранний вызов с неподготовленным контекстом приводит к неустановленным полям и углубленным нулевым указателям.

Спасибо всем, кто пытался поймать этот, но так как я не публиковал код активности, он был практически доступным с любой другой точки зрения, кроме моей. Извините за это.

0 голосов
/ 23 июля 2011

Ответ на первый вопрос: Нет, вам не нужно рутированное устройство.

О: adb shell sqlite3 Что вы пытаетесь достичь здесь?Это не имеет смысла, как показано.

О "Нет разрешения": да, это нормально.Вы не можете получить доступ к файлам, принадлежащим приложению, на реальном устройстве, таком как galaxy s (хотя это вполне возможно в эмуляторе).

Второй вопрос: очевидно, mDatabaseHelper - это null, и когда вы звоните mDatabaseHelper.getReadableDatabase(); в вашем getAllRecords(), это вызывает NPE.У вас есть другой конструктор для вашего Database класса?Как тот, который не инициализирует mDatabaseHelper?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...