Android SQLite, onCreate () не вызывается - PullRequest
0 голосов
/ 08 февраля 2019

Я изо всех сил пытался создать БД SQLite в моем приложении для Android.Я просмотрел множество учебных пособий и довольно много существующих вопросов о переполнении стека и других сайтах.

Вот мой класс DatabaseHelper

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

public class DatabaseHelper extends SQLiteOpenHelper {

public SQLiteDatabase db;
public static final String DATABASE_NAME = "user.db";

//Module table
public static final String MODULE_TABLE = "modules_table";
public static final String MODULE_COL_1 = "ID";
public static final String MODULE_COL_2 = "CODE";
public static final String MODULE_COL_3 = "TITLE";

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
    Log.d("SQL", "SQLite dbhelper");
    db = getWritableDatabase();
}

@Override
public void onCreate(SQLiteDatabase db) {
    //db.execSQL("create table " + MODULE_TABLE + "(" + MODULE_COL_1 + " INTEGER PRIMARY KEY AUTOINCREMENT, " + MODULE_COL_2 + " TEXT, " + MODULE_COL_3 + " TEXT " +")");
    db.execSQL("create table modules_table (ID INTEGER PRIMARY KEY 
AUTOINCREMENT, CODE TEXT, TITLE TEXT)");
    Log.d("SQL", "SQLite onCreate");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + MODULE_TABLE);
    onCreate(db);
}
}

Мне удалось получить SQLite dbhelper дляпоявляются в logcat, но не могут отобразить SQLite onCreate, и не могут найти базу данных где-либо в проводнике файлов или на самом устройстве, как эмулируемом, так и реальном устройстве.форматирование кода!

Ответы [ 2 ]

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

Вместо этого я не использую SQL-запрос, например

db.execSQL("create table modules_table (ID INTEGER PRIMARY KEY 
AUTOINCREMENT, CODE TEXT, TITLE TEXT)");
    Log.d("SQL", "SQLite onCreate");

, я использую собственную реализацию класса SQLiteOpenHelper

import android.content.Context;
import android.content.res.AssetManager;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.zip.GZIPOutputStream;

public class DbProvider extends SQLiteOpenHelper {

    private static final ReentrantReadWriteLock LOCK = new ReentrantReadWriteLock(true);
    private static final int VERSION = 0;
    private final String DB_NAME = "mydb";

    private final AssetManager assets;

    private DbProvider(Context context) {
        super(context, DB_NAME, null, VERSION);
        assets = context.getAssets();
    }

    @NonNull
    public static DbProvider getInstance() {
        return new DbProvider(App.getContext());
    }

    @NonNull
    public static ReentrantReadWriteLock.WriteLock writeLock() {
        return LOCK.writeLock();
    }

    @NonNull
    public static ReentrantReadWriteLock.ReadLock readLock() {
        return LOCK.readLock();
    }

    @NonNull
    public static ReentrantReadWriteLock getLock() {
        return LOCK;
    }

    public static void close(DbProvider instance) {
        try {
            instance.close();
        } catch (Exception ex) {

        }
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        executeQuery(db, "db-scripts/database.sql", false);
        Log.w("database", "database create");
        executeQuery(db, "db-scripts/database_updates.sql", true);
        Log.w("database", "database update");
    }

    private void executeQuery(SQLiteDatabase db, String sql, boolean shouldHandleExceptions) {
        BufferedReader bufferedReader = null;
        try {
            bufferedReader = new BufferedReader(new InputStreamReader(assets.open(sql)));
            String line;
            File tempDbScript = new File(Environment.getExternalStorageDirectory(), "iErunt/dbBackup");
            tempDbScript.getParentFile().mkdirs();
            tempDbScript.createNewFile();
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(tempDbScript));
            while ((line = bufferedReader.readLine()) != null) {
                line = line.replaceAll("\t+", " ").replaceAll("\n+", " ").replaceAll(" +", " ").replaceAll(";", ";\n");
                if (line.startsWith("--") || line.isEmpty()) {
                    continue;
                }
                bufferedWriter.write(line);
                bufferedWriter.flush();
            }
            bufferedWriter.close();
            bufferedReader.close();
            bufferedReader = new BufferedReader(new FileReader(tempDbScript));
            db.beginTransaction();
            while ((line = bufferedReader.readLine()) != null) {
                if (!(line = line.trim().replace(";", "")).isEmpty()) {
                    if (shouldHandleExceptions) {
                        try {
                            db.execSQL(line);
                        } catch (SQLException ex) {
                            Log.e("database", ex.getMessage(), ex);
                        }
                    } else {
                        db.execSQL(line);
                    }
                }
            }
            db.setTransactionSuccessful();
            db.endTransaction();
            tempDbScript.delete();
        } catch (IOException ex) {
            Log.e("database", ex.getMessage(), ex);
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {

                }
            }
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        executeQuery(db, "db-scripts/database_updates.sql", true);
    }
}

и помещаю исходную схему БД вашей базы данных вassets/db-scripts/database.sql и всякий раз, когда вы вносите изменения в БД, помещайте ваши запросы на изменение в assets/db-scripts/database_updates.sqlПри обновлении базы данных увеличьте VERSION базы данных.

Этот класс читает весь сценарий SQL и выполняет один за другим .что значительно сокращает время разработки .

Примечание: вам понадобится разрешение android.permission.WRITE_EXTERNAL_STORAGE, так как это создает временный файл и удаляет его в конце

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

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

Я бы предложил использовать следующее ( временно ) в упражнении: -

DatabaseHelper myDBHelper = new DatabaseHelper(this); //<<<<<<<<< you appear to already have the equivalent of this line (if so use whatever variable name you have given to the DatabaseHelper object)

Cursor csr = myDBHelper.getWritableDatabase().query("sqlite_master",null,null,null,null,null,null);
DatabaseUtils.dumpCursor(csr);
csr.close();

Запустите и проверьте журнал.Вы должны увидеть выходные данные для вашей modules_table , а также sqlite_sequence (последняя, ​​поскольку вы закодировали автоинкремент.

sqlite_master - это системная таблица, в которой хранятсясистемная информация, такая как имена таблиц и индексов, т. е. схема.

Дополнительно - доступ к файлу базы данных

На устройстве, которое не имеет прав root, данные каждого приложения (данные / данные) защищеныпоэтому вы не сможете увидеть файл базы данных.

В эмуляторе это зависит от эмулятора. Я считаю, что более поздние версии Android Studio теперь разрешают доступ, например: -

enter image description here

  • Обратите внимание, что выше приведен Android 10.1 Pie (API 28), и, следовательно, в базе данных есть запись с записью в очередь (WAL) и, таким образом, -shm и -Файлы wal также существуют.

  • Пакет - mjt.pvcheck. Полный путь - data / data / mjt.pvcheck / database.

    • Как вы можетесм. каталог cache , тогда я бы предложилЕсли произошел сбой, база данных не существует, но у вас, по-видимому, есть доступ согласно , однако при проверке через обозреватель файлов виртуального устройства единственная подпапка в моем пакете - это кэш .
    • Возможно, попробуйте выполнить повторный запуск на устройстве (обратите внимание, что в проводнике устройств повторно выберите устройство, поскольку оно не обновляется), что может быть еще одной причиной, по которой вы не видели базу данных.
...