Как обратиться к базе данных SQLite из «независимого» метода в Android - PullRequest
1 голос
/ 19 января 2011

У меня есть код для доступа к таблице SQLite, которая отлично работает из моей "основной" деятельности.Я пытаюсь сделать код более элегантным, создав отдельный класс для обработки вставок данных, удалений и т. Д.

Когда я перемещаю точно такой же код из основного действия в отдельный класс, я получаю следующую ошибку:

Метод openOrCreateDatabase (String, int, null) не определен для типа BarCode

Я замечаю, что при расширении класса моей базы данных с помощью «Activity» возникает ошибкадалеко.Однако теперь, когда я запускаю код, я получаю NullPointerException .

Как будет правильным способом абстрагировать код базы данных и при этом иметь возможность ссылаться на него из действия в Android?

Извините, если я неправильно понял жаргон, потому что я новичок в Android и Java.

Вот полный код:

package com.example.stockcontrol;

import java.util.Locale;

import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;

public class BarCode extends Activity {

 public BarCode() {

 }

 public void insertBarCode(String upc) {

  SQLiteDatabase db;
        db = openOrCreateDatabase(
         "StockControl.db"
         , SQLiteDatabase.CREATE_IF_NECESSARY
         , null
        );
        db.setVersion(1);
        db.setLocale(Locale.getDefault());
        db.setLockingEnabled(true);

        ContentValues mUpc = new ContentValues();
        mUpc.put("upc", "444");
        mUpc.put("description", "Box o toast");
        mUpc.put("scan_count", "1");
        db.insertOrThrow("tbl_upc", null, mUpc);

 }

}

Ответы [ 3 ]

2 голосов
/ 19 января 2011

Вместо того, чтобы ваш класс базы данных расширял Activity, вы должны передать соответствующий Context классу. Вы можете передать его в конструктор и сохранить ссылку на Context как переменную класса.

public class BarCode {
    private final Context mContext;

    public BarCode(Context context) {
        mContext = context;
    }

    public void insertBarCode(String upc) {

     SQLiteDatabase db;
           db = mContext.openOrCreateDatabase(
            "StockControl.db"
            , SQLiteDatabase.CREATE_IF_NECESSARY
            , null
           );
           db.setVersion(1);
           db.setLocale(Locale.getDefault());
           db.setLockingEnabled(true);

           ContentValues mUpc = new ContentValues();
           mUpc.put("upc", "444");
           mUpc.put("description", "Box o toast");
           mUpc.put("scan_count", "1");
           db.insertOrThrow("tbl_upc", null, mUpc);

    }
}

Чтобы использовать класс, вы должны сделать это в своей деятельности:

BarCode barCode = new BarCode(this);
barCode.insertBarCode("123456");
1 голос
/ 19 января 2011

Кажется, что способ решить эти проблемы - создать помощника данных. Я следовал этому руководству и теперь могу ссылаться на код базы данных из любого места: http://www.screaming -penguin.com / узел / 7742

Edit: На самом деле я нашел гораздо лучший учебник, отличный от самих Google, в котором содержится ряд рекомендаций по выполнению подобных задач, в том числе использование адаптера данных для правильного абстрагирования доступа к базе данных. Это учебник для ноутбуков здесь: http://developer.android.com/resources/tutorials/notepad/index.html

0 голосов
/ 19 января 2011

Вы можете попробовать передать указатель БД в вашу подпрограмму mUpc.

mUpc.put(db,"upc","444");

Вам придется переписать конструктор mUpc, чтобы принять объект db.

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