Чтение базы данных из папки ресурсов

У меня есть файл db в папке с активами, как я могу его использовать. Я должен уметь читать и записывать файл базы данных. Если я использую

SqliteDatabase.open(context.openassest().open(filrname),null); Исключительный файл db не найден Не проверять. Синтаксис, который я сделал правильно, у меня на коленях, смотрите содержание


person Pradeesh    schedule 10.04.2018    source источник


Ответы (2)


Чтобы использовать упакованную базу данных (то есть одну, включенную в качестве актива) для полноценного использования, база данных должна быть разархивирована (автоматически) и скопирована в подходящее место (чаще всего data/data/<package_name>/databases/<database_name>, где <package_name> и <database_name> будут соответствовать имени пакета приложения и имени базы данных. соответственно).

Для «упаковки» база данных должна быть включена в папку ресурсов и предпочтительно в папку баз данных (требуется при использовании SQLiteAssetHelper без изменений).

Кроме того, копия должна быть сделана до фактического открытия базы данных, после чего ее можно будет открыть.

Использование SQLiteAssetHelper

  1. Самым первым шагом является создание базы данных для упаковки, это не рассматривается, поскольку доступно множество инструментов. В этом примере база данных представляет собой файл с именем test.db.

  2. Затем вы должны создать свой проект. В этом случае проект назывался DBtest с Compnay Domian как com.DBtest, поэтому имя пакета - dbtest.com.dbtest. .

  3. Следующим этапом является копирование базы данных в папку с активами.

    1. Creating the assets folder in the src/main folder, if it doesn't already exist.
    2. Создание папки баз данных "" в папке ** assets, если она еще не существует.
    3. Копирование файла базы данных (в данном примере test.db) в папку базы данных.

      • enter image description here
  4. Следующий этап - настроить проект для использования SQLiteAssetHelper, включив его в build.gradle приложения.

    1. Edit the build.gradle in the App folder.
    2. Добавьте строку implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1' в раздел зависимостей.
    3. Нажмите Синхронизировать сейчас.

введите описание изображения здесь


  1. Создайте класс, который является подклассом недавно появившегося / теперь доступного класса SQLiteAssethelper. В этом упражнении он будет называться DBHelper.

    1. Right Click the MainActivity java class, select New and then Java Class.
    2. В поле "Имя" введите DBHelper.
    3. В поле SuperClass начните вводить SQLiteAsset (теперь класс SQliteAssetHelper будет доступен для выбора), поэтому выберите его. Он должен решить быть: -
    4. Щелкните ОК. введите описание изображения здесь
  2. Создайте конструктор для класса DBHelper по строкам

:-

public class DBHelper extends SQLiteAssetHelper {

    public static final String DBNAME = "test.db"; //<<<< must be same as file name
    public static final int DBVERSION = 1;

    public DBHelper(Context context) {
        super(context,DBNAME,null,DBVERSION);
    }
}
  1. Создайте экземпляр DBHelper, а затем получите доступ к базе данных.

    1. Note for ease another class called CommonSQLiteUtilities, as copied from Are there any methods that assist with resolving common SQLite issues?
    2. Создайте экземпляр класса DBHelper, используя что-нибудь вроде

      • DBHelper mDBHlpr = new DBHelper(this);
    3. с помощью CommonSQLiteUtilities доступ к базе данных осуществлялся с помощью: -

      • CommonSQLiteUtilities.logDatabaseInfo(mDBHlpr.getWritableDatabase());
    4. MainActivity в полном объеме стал

:-

public class MainActivity extends AppCompatActivity {

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

        DBHelper mDBHlpr = new DBHelper(this);
        CommonSQLiteUtilities.logDatabaseInfo(mDBHlpr.getWritableDatabase());
    }
}

Результатом было успешное ведение журнала прогона: -

04-11 06:12:55.091 1401-1401/dbtest.com.dbtest W/SQLiteAssetHelper: copying database from assets...
    database copy complete
04-11 06:12:55.123 1401-1401/dbtest.com.dbtest I/SQLiteAssetHelper: successfully opened database test.db
04-11 06:12:55.127 1401-1401/dbtest.com.dbtest D/SQLITE_CSU: DatabaseList Row 1 Name=main File=/data/data/dbtest.com.dbtest/databases/test.db
    Database Version = 1
    Table Name = mytable Created Using = CREATE TABLE mytable (
        _id INTEGER PRIAMRY KEY, 
        mydata TEXT, 
        inserted INTEGER DEFAULT CURRENT_TIMESTAMP
    )
    Table = mytable ColumnName = _id ColumnType = INTEGER PRIAMRY KEY Default Value = null PRIMARY KEY SEQUENCE = 0
    Table = mytable ColumnName = mydata ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
    Table = mytable ColumnName = inserted ColumnType = INTEGER Default Value = CURRENT_TIMESTAMP PRIMARY KEY SEQUENCE = 0
    Table Name = android_metadata Created Using = CREATE TABLE android_metadata (locale TEXT)
    Table = android_metadata ColumnName = locale ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
  • Первые две строки взяты из SQliteAssethelper, остальные - из метода logDatabaseInfo класса CommonSQLiteUtilities.
  • При последующих запусках база данных не будет скопирована, поскольку она уже существует.
person MikeT    schedule 11.04.2018

Вы можете скопировать базу данных из своих активов в папку баз данных при установке, а затем использовать ее оттуда.

/data/data/<Your-Application-Package-Name>/databases/<your-database-name>
person Juan    schedule 10.04.2018
comment
Бро любой видеоурок Если сделаю копировать после установки. - person Pradeesh; 11.04.2018