Считать данные с готовой БД

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Аватара пользователя
antihawk
Сообщения: 84
Зарегистрирован: 09 июн 2013, 16:14

Считать данные с готовой БД

Сообщение antihawk » 08 фев 2015, 22:34

Сделал готовую бд через sqlitebrowser. Закинул в проект, пытаюсь считать данные, не получается. Порылся, нашел что-то про Simplecursoradapter, но не смог разобраться.

Класс для роботы с бд:

Код: Выделить всё

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

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

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBq extends SQLiteOpenHelper {

    //Путь к папке с базами на устройстве
    public static String DB_PATH;
    //Имя файла с базой
    public static String DB_NAME;
    public SQLiteDatabase database;
    public final Context context;

    public SQLiteDatabase getDb() {
        return database;
    }

    public DBq(Context context, String databaseName) {
        super(context, databaseName, null, 1);
        this.context = context;
        //Составим полный путь к базам для вашего приложения
        String packageName = context.getPackageName();
        DB_PATH = String.format("//data//data//%s//databases//", packageName);
        DB_NAME = databaseName;
        openDataBase();
    }

    //Создаст базу, если она не создана
    public void createDataBase()
    {
        SQLiteDatabase db;
        boolean dbExist = checkDataBase();

        if (!dbExist)
        {
            db = getReadableDatabase();
            db.close();

            try
            {
                copyDataBase();
            }
            catch (IOException e)
            {
                throw new Error("Error copying database!");
            }
        }
    }
    //Проверка существования базы данных
    private boolean checkDataBase() {
        SQLiteDatabase checkDb = null;
        try {
            String path = DB_PATH + DB_NAME;
            checkDb = SQLiteDatabase.openDatabase(path, null,
                    SQLiteDatabase.OPEN_READONLY);
        } catch (SQLException e) {
            Log.e(this.getClass().toString(), "Error while checking db");
        }
        //Андроид не любит утечки ресурсов, все должно закрываться
        if (checkDb != null) {
            checkDb.close();
        }
        return checkDb != null;
    }
    //Метод копирования базы
    private void copyDataBase() throws IOException {
        // Открываем поток для чтения из уже созданной нами БД
        //источник в assets
        InputStream externalDbStream = context.getAssets().open(DB_NAME);

        // Путь к уже созданной пустой базе в андроиде
        String outFileName = DB_PATH + DB_NAME;

        // Теперь создадим поток для записи в эту БД побайтно
        OutputStream localDbStream = new FileOutputStream(outFileName);

        // Собственно, копирование
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = externalDbStream.read(buffer)) > 0) {
            localDbStream.write(buffer, 0, bytesRead);
        }
        // Мы будем хорошими мальчиками (девочками) и закроем потоки
        localDbStream.close();
        externalDbStream.close();

    }

    public SQLiteDatabase openDataBase() throws SQLException {
        String path = DB_PATH + DB_NAME;
        if (database == null) {
            createDataBase();
            database = SQLiteDatabase.openDatabase(path, null,
                    SQLiteDatabase.OPEN_READWRITE);
        }
        return database;
    }
    @Override
    public synchronized void close() {
        if (database != null) {
            database.close();
        }
        super.close();
    }
    @Override
    public void onCreate(SQLiteDatabase db) {}
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}
Основной класс:

Код: Выделить всё

public class SinglePlayer extends Activity {

    private static final String DB_NAME = "databasecg.sqlite3";
    private static final String TABLE_NAME = "databasecg";
    private static final String FRIEND_ID = "_id";
    private static final String QUESTION = "qst";
    private static final String MEASURE = "measure";
    private static final String ANSWER = "answer";

    private SQLiteDatabase database;

    TextView sptvQst;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.singleplayer);

        //Наш ключевой хелпер
        DBq dbOpenHelper = new DBq(this, DB_NAME);
        database = dbOpenHelper.openDataBase();
        //Все, база открыта!
        loadBase();

        sptvQst = (TextView)findViewById(R.id.sptvQst);

    }

    private void loadBase() {
        String qst, measure;
        int answer;
        Cursor cCheckDate = database.query(TABLE_NAME,
                new String[] {FRIEND_ID, QUESTION},
                null, null,null,null,
                QUESTION);

        if (cCheckDate.moveToFirst())
        {
            int nameColIndex = cCheckDate.getColumnIndex("name");
            int qstColIndex = cCheckDate.getColumnIndex("qst");
            int measureColIndex = cCheckDate.getColumnIndex("measure");
            int answerColIndex = cCheckDate.getColumnIndex("answer");
            do
            {
                qst = String.valueOf(cCheckDate.getString(answerColIndex));
                measure = String.valueOf(cCheckDate.getString(answerColIndex));
                answer = Integer.parseInt(cCheckDate.getString(answerColIndex));
                sptvQst.setText(qst);
            } while (cCheckDate.moveToNext());
        }
        cCheckDate.close();
    }
}
Вылетает на строчке:
qst = String.valueOf(cCheckDate.getString(answerColIndex));
Таблица в формате:
id, text, text, int. Вопрос в том как считать все эти данные в разные textview.
Ну оно и понятно почему. Помогите с правильной реализацией. Спасибо.

Ответить