Мое приложение не получает доступ к моей предварительно заполненной базе данных, а создает пустую базу данных. - PullRequest
0 голосов
/ 03 февраля 2020

Я подаю заявку на викторину. Я создал предварительно заполненную базу данных, включив в нее столбцы questionNumber, subject, question, correctAnswer, неправильный ответ1, неправильный ответ2 и неправильный ответ 3 (см. Рисунок внизу). Я проверял, будут ли работать запросы к базе данных, поэтому я создал класс TestActivity с соответствующим ему файлом XML, «activity_test». Я включил одну кнопку и TextView. Моя цель - запросить базу данных и показать ее внутри textView после нажатия кнопки. Моя проблема заключается в том, что в моем классе DatabaseHelper, который расширяется вместе с SQLiteOpenHelper, создается пустая база данных вместо запросов к предварительно заполненной базе данных. Я не знаю, где я ошибся, но я подозреваю, что это ошибка CREATE_TABLE. Я мог бы сделать опечатки. Я попытался повторно набрать и снова набрать схему, но в textView не было отображено ни одной записи.

В этом тесте я только попытался запросить столбец «errorAnswers3», поскольку в базе данных слишком много записей.

Это мой класс "DatabaseAdapter"

package com.example.quizalarm;

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

public class DatabaseAdapter {

    static class DatabaseHelper extends SQLiteOpenHelper {
        private static final String DATABASE_NAME="qasadb.db";
        private static final String TABLE_NAME="qasaMultipleChoicequizdb";
        private static final String QUESTION_NUMBER="questionNumber";
        private static final String SUBJECT="subject";
        private static final String QUESTION="question";
        private static final String CORRECT_ANSWER="correctAnswer";
        private static final String WRONG_ANSWER1="wrongAnswer1";
        private static final String WRONG_ANSWER2="wrongAnswer2";
        private static final String WRONG_ANSWER3="wrongAnswer3";
        private static final String CREATE_TABLE="CREATE TABLE "+
                TABLE_NAME+" ( "+
                QUESTION_NUMBER+" INTEGER PRIMARY KEY AUTOINCREMENT, "+
                SUBJECT+" TEXT, "+
                QUESTION+" TEXT, "+
                CORRECT_ANSWER+" TEXT, "+
                WRONG_ANSWER1+" TEXT, " +
                WRONG_ANSWER2+" TEXT, "+
                WRONG_ANSWER3+" TEXT" +
                ")";
        private static final String DROP_TABLE="DROP TABLE IF EXISTS "+TABLE_NAME;
        private static final int DATABASE_VERSION=1;
        private Context context;

        //constructor
        public DatabaseHelper(Context context){
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
            this.context = context;
            Message.message(context, "Constructor called");
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            try {
                db.execSQL(CREATE_TABLE);
                Message.message(context, "onCreate was called");
            } catch (SQLException e){
                Message.message(context, ""+e);
            }

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            try {
                Message.message(context, "onUpgrade was called");
                db.execSQL(DROP_TABLE);
                onCreate(db);
            } catch (SQLException e){
                e.printStackTrace();
            }
        }
    }

    DatabaseHelper helper;
    public DatabaseAdapter (Context context){
        helper = new DatabaseHelper(context);
    }

    public String getData(){
        SQLiteDatabase db=helper.getWritableDatabase();

        //select necessary columns from table

        String[] columns={DatabaseHelper.WRONG_ANSWER3};
        Cursor cursor=db.query(DatabaseHelper.TABLE_NAME, columns, null, null, null, null, null);
        StringBuffer sb=new StringBuffer();
        while (cursor.moveToNext()){
            String cWA3 = cursor.getString(6);
            sb.append(cWA3);
        }
        return sb.toString();
    }
}

Это мой класс "TestActivity"

package com.example.quizalarm;

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

public class TestActivity extends AppCompatActivity {


    DatabaseAdapter helper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        helper = new DatabaseAdapter(this);
    }

    public void viewDetails(View view){
        TextView textShowData = findViewById(R.id.textShowData);
        String data = helper.getData();
        textShowData.setText(data);
    }
}

Вот моя предварительно заполненная база данных: pre-populated database

схема ее таблицы "qasaMultipleChoicequizdb" CREATE TABLE "qasaMultipleChoicequizdb" ("questionNumber" INTEGER PRIMARY KEY AUTOINCREMENT, " тема "ТЕКСТ", вопрос "ТЕКСТ", "правильный ответ" ТЕКСТ, "неправильный ответ1" ТЕКСТ, "неправильный ответ2" ТЕКСТ, "неправильный ответ 3" ТЕКСТ)

Моя ссылка на этот код от этот плейлист . Запчасти / видео 160-166).

1 Ответ

0 голосов
/ 14 марта 2020

Для меня гораздо проще использовать SQLiteAssetHelper, чем SQLiteOpenHelper. Вам не нужно использовать схему «CREATE TABLE», вам просто нужно добавить определенную зависимость в build.gradle (Module: app), чтобы использовать это.

Вот ссылка: https://www.javahelps.com/2015/04/import-and-use-external-database-in.html.

Надеюсь, это поможет:)

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