Ошибка при открытии базы данных SQLite - PullRequest
0 голосов
/ 24 марта 2012

Я использую следующий метод для открытия базы данных SQLite.

private void open() {
    database = dbHelper.getReadableDatabase();
}

Он является неотъемлемой частью dbHelper.

public void onCreate(SQLiteDatabase la_db) {
    String s;
    try {
        InputStream in = context.getResources().openRawResource(R.raw.sql);
        DocumentBuilder builder = DocumentBuilderFactory.newInstance()
                .newDocumentBuilder();
        Document doc = builder.parse(in, null);
        NodeList statements = doc.getElementsByTagName("statement");
        for (int i = 0; i < statements.getLength(); i++) {
            s = statements.item(i).getChildNodes().item(0).getNodeValue();
            la_db.execSQL(s);
        }
    } catch (Throwable t) {
        Toast.makeText(context, t.toString(), 50000).show();
    }
}

Часть sql.xml

....
<statement>
CREATE TABLE IF NOT EXISTS la_table (
    _id INTEGER PRIMARY KEY AUTOINCREMENT, 
    suggest_text_1 VARCHAR(100),
    test_value_1 VARCHAR(100),
    test_value_2 VARCHAR(100),
    test_type_1 VARCHAR(50),
    suggest_intent_data VARCHAR(5))
</statement>
<statement>INSERT INTO la_table VALUES(1,"Sodium (Na)","310 - 330 mg/dl",null,"Serum","1")</statement>
<statement>INSERT INTO la_table VALUES(2,"Potassium (K)","14 - 20 mg/dl","3.5 - 5 mmol/L or mEq/L","Serum","2")</statement>
.....

И я получаю эту ошибку:

01-01 00:59:38.725: E/AndroidRuntime(2060): Caused by: java.lang.NullPointerException
01-01 00:59:38.725: E/AndroidRuntime(2060):     at com.assistant.lab.royale.DataSource.open(DataSource.java:42)
01-01 00:59:38.725: E/AndroidRuntime(2060):     at com.assistant.lab.royale.DataSource.listViewCursor(DataSource.java:25)
01-01 00:59:38.725: E/AndroidRuntime(2060):     at com.assistant.lab.royale.LabAssistant.onCreate(LabAssistant.java:24)
01-01 00:59:38.725: E/AndroidRuntime(2060):     at android.app.Activity.performCreate(Activity.java:4465)

Ответы [ 2 ]

1 голос
/ 24 марта 2012

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

Добавить конструктор:

private DatabaseHelper dbHelper;
public DataSource(Context context) {
    this.dbHelper =  new DatabaseHelper(context);
}

Вы не можете избежать передачи в контексте, но обычно это не большая проблема, из каждого Activity вы можете просто передать this как context. После этого изменения вы сможете без проблем использовать dbHelper.

1 голос
/ 24 марта 2012

dbHelper является нулем в вашем open(), вам нужно создать экземпляр, если ваш помощник, прежде чем вы сможете его использовать.

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