Попытка загрузить, а затем выполнить запрос и базу данных SQLite в моем приложении для Android - PullRequest
0 голосов
/ 21 апреля 2011

По сути, я пытаюсь загрузить базу данных (romskillDB.db) из папки ресурсов и затем запросить информацию, которую я хочу. Я перепробовал почти все вспомогательные классы db, которые я мог найти в сети, я пытался исследовать каждый отдельный метод, вызываемый упомянутыми вспомогательными классами, и я даже взял пример кода, скопировал его, а затем попытался адаптировать его под свои нужды , Все безрезультатно. Так что это моя последняя попытка получить ответ, который мне нужен, прежде чем я сдаюсь и жестко закодирую данные в обширный список в XML-файлах. Пожалуйста, просмотрите мой код ниже и большое спасибо за то, что нашли время помочь.

Это класс, который отображает результаты.

package com.rom.testdb;

import java.io.IOException;
import com.rom.testdb.DbUtils;
import android.app.ListActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.TextView;

public class testDB extends ListActivity {

    SQLiteDatabase db;
    DbUtils dbUtil;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        dbUtil = new DbUtils();

        try {
            DbUtils.createDatabaseIfNotExists(this);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        SQLiteDatabase db = DbUtils.getStaticDb();

        String table = "magegeneral";
        String[] columns = {"_id", "name"};
        Cursor cursor = db.query(table, columns, null, null, null, null, null);
        startManagingCursor(cursor);
        cursor.moveToFirst();  
        int thisId = cursor.getInt(0);
        String thisName = cursor.getString(1);
        cursor.close();

        TextView textview = new TextView(this);
        textview.setText(thisId + " " + thisName);
        setContentView(textview);

    }
}

Это код помощника.

package com.rom.testdb;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

public class DbUtils {
    private static final String DB_PATH = "/data/data/com.rom.testdb/databases/";
    private static final String DB_NAME = "romskillDB.db";

    public static void createDatabaseIfNotExists(Context context) throws IOException {
        boolean createDb = false;

        File dbDir = new File(DB_PATH);
        File dbFile = new File(DB_PATH + DB_NAME);
        if (!dbDir.exists()) {
            dbDir.mkdir();
            createDb = true;
        }
        else if (!dbFile.exists()) {
            createDb = true;
        }
        else {
            // Check that we have the latest version of the db
            boolean doUpgrade = false;

            // Insert your own logic here on whether to upgrade the db; I personally
            // just store the db version # in a text file, but you can do whatever
            // you want.  I've tried MD5 hashing the db before, but that takes a while.

            // If we are doing an upgrade, basically we just delete the db then
            // flip the switch to create a new one
            if (doUpgrade) {
                dbFile.delete();
                createDb = true;
            }
        }

        if (createDb) {
            // Open your local db as the input stream
            InputStream myInput = context.getAssets().open(DB_NAME);

            // Open the empty db as the output stream
            OutputStream myOutput = new FileOutputStream(dbFile);

            // transfer bytes from the inputfile to the outputfile
            byte[] buffer = new byte[1024];
            int length;
            while ((length = myInput.read(buffer)) > 0) {
                myOutput.write(buffer, 0, length);
            }

            // Close the streams
            myOutput.flush();
            myOutput.close();
            myInput.close();
        }
    }

    public static SQLiteDatabase getStaticDb() {
        return SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, SQLiteDatabase.OPEN_READONLY);
    }
}

И снова, спасибо за ваше время!

1 Ответ

0 голосов
/ 15 сентября 2013

Есть две проблемы, которые могут вызвать это раздавить - а. ваш это список действий, которые вы запускаете внутри, попробуйте инициировать БД с помощью getApplicationContext () (или что-то подобное, что я забыл точный термин ...) б. Вы не можете выполнять логические операции из потока пользовательского интерфейса, используйте asynctask для обработки запросов БД в фоновом режиме.

что касается второго, я уверен на 95%, поскольку у меня была похожая проблема, и это (с помощью asynctask) решило мою проблему

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