Запрос SQLite SELECT во внешней базе данных Android - ошибка таблицы - PullRequest
0 голосов
/ 14 февраля 2019

Я занимаюсь разработкой приложения для сбора данных с использованием нескольких таблиц реляционных данных.Я создал свою базу данных.И код работает нормально в случае первой таблицы.Если я попытаюсь выполнить тот же запрос для второй таблицы, он покажет, что таблица не существует, хотя таблица находится в базе данных.

Структура базы данных

Database structure

public String getName(String Plant) {
    c1 = db.rawQuery("select * from Area where PAd = '" + Plant + "'", new String[]{});
    StringBuffer buffer = new StringBuffer();

    while (c.moveToNext()) {
        String plant = c.getString(0);
        buffer.append("" + plant);
    }

    return buffer.toString();
}

Журнал ошибок:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.dbtest, PID: 28350
    android.database.sqlite.SQLiteException: no such table: Area (code 1): , while compiling: select * from Area where PAd = 'Plant02'
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:890)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:501)
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
        at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
        at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
        at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1392)
        at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1331)
        at com.example.dbtest.DatabaseAcess.getName(DatabaseAcess.java:46)
        at com.example.dbtest.MainActivity$3.onClick(MainActivity.java:86)
        at android.view.View.performClick(View.java:6305)
        at android.view.View$PerformClick.run(View.java:24840)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6501)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Структура таблицы второй таблицы

 CREATE TABLE Area (
    Name    TEXT,
    Address TEXT,
    PAd     TEXT
 );

Структура таблицы первой таблицы

CREATE TABLE Table1 (
   Name    TEXT,
   Address TEXT
);

DatabaseOpenHelper код.

public class DatabaseOpenHelper extends SQLiteAssetHelper {

    private static final String DATABASE_NAME = "MyExternalDatabase1.db";
    public static final int DATABASE_VERSION = 1;

    public DatabaseOpenHelper(Context context){
        super(context,DATABASE_NAME,null,DATABASE_VERSION);
    }
}

DatabaseAccess код.

public class DatabaseAcess {

    private SQLiteOpenHelper openHelper;
    private SQLiteDatabase db;
    private static DatabaseAcess instance;
    Cursor c = null;
    Cursor c1 = null;

    private DatabaseAcess(Context context){
        this.openHelper = new DatabaseOpenHelper(context);
    }

    public static DatabaseAcess getInstance(Context context){
        if(instance == null){
            instance = new DatabaseAcess(context);
        }

        return instance;
    }

    public void open(){
        this.db = openHelper.getWritableDatabase();
    }

    public void close(){
        if(db!=null){
            this.db.close();
        }
    }

    public String getAddress(String name){
        c= db.rawQuery("select Address from Table1 where Name = '" + name + "'", new String[]{});
        StringBuffer buffer = new StringBuffer();

        while (c.moveToNext()) {
            String address = c.getString(0);
            buffer.append("" + address);
        }

        return buffer.toString();
    }

    public String getName(String Plant) {
        c1 = db.rawQuery("select Name from Area where PAd = '" + Plant + "'", null);
        StringBuffer buffer = new StringBuffer();

        while (c.moveToNext()) {
            String plant = c.getString(0);
            buffer.append(""+plant);
        }

        return buffer.toString();
    }
}

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Я думаю, что под внешней базой данных вы подразумевали базу данных, которую хотите загрузить из каталога asset.Здесь вам нужно сначала скопировать базу данных во внутреннюю память вашего приложения, чтобы сделать ее доступной из вашего кода.Поэтому я хотел бы предложить вам сделать следующее при первом запуске приложения.

public static final String DB_PATH = "/data/data/" + "com.your.package.name" + "/databases/";

private void copyFromAssetsAndCreateDatabase() {
    InputStream yourDatabaseFromAsset;

    try {
        yourDatabaseFromAsset = getApplicationContext().getAssets().open("MyExternalDatabase1");

        File dir = new File(DataHelper.DB_PATH);
        if (!dir.exists()) dir.mkdir();
        File f = new File(DataHelper.DB_PATH + "MyExternalDatabase1" + ".sqlite");
        if (!f.exists()) {
            f.createNewFile();
        }

        OutputStream mOutput = new FileOutputStream(f);
        byte[] mBuffer = new byte[1024];
        int mLength;

        while ((mLength = yourDatabaseFromAsset.read(mBuffer)) > 0)
            mOutput.write(mBuffer, 0, mLength);

        mOutput.flush();
        mOutput.close();
        mInputEnglish.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

Теперь, когда база данных копируется из вашей внешней папки во внутреннее хранилище, где обычно находятся базы данных, она должна найти базу данных без каких-либо ошибок.Я не знаю о первой базе данных, хотя.Я думаю, что он был создан в вашем приложении с помощью оператора CREATE TABLE.

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

0 голосов
/ 14 февраля 2019

Одной из возможных причин является то, что вы создали только первую таблицу в первый раз.После этого вы добавляете код для второй таблицы.База данных заметок уже создана и больше не будет вызывать onCreate ().Вы должны обновить версию базы данных и создать вторую таблицу в onUpgrade ().

Я уже делал те же ошибки.

0 голосов
/ 14 февраля 2019

Может быть, это может помочь вам

public String getName(String Plant) {
Cursor c = db.rawQuery("SELECT * FROM Area WHERE PAd='+Plant+'", null);
    StringBuffer buffer = new StringBuffer();
    while (c.moveToNext()) {
        String plant = c.getString(0);
        buffer.append(""+plant);
    }

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