ORMLite - данные SQLCipher теряются при получении данных после принудительного закрытия / уничтожения приложений из последних приложений - PullRequest
0 голосов
/ 14 ноября 2018

Я хочу реализовать SQLChiper с ORMLite этой библиотекой, я хочу установить сборку gradle, следуйте за нами:

build.gradle

implementation 'com.j256.ormlite.cipher:ormlite-sqlcipher:1.2@aar'
implementation 'com.j256.ormlite:ormlite-core:5.1'
implementation 'com.j256.ormlite:ormlite-android:5.1'
implementation 'net.zetetic:android-database-sqlcipher:3.5.9@aar'

DatabaseHelper.java

public class DatabaseHelper extends OrmLiteSqliteOpenHelper {

    private static final String DATABASE_NAME = "ut_v2_secure.db";
    private static final String DATABASE_PATH = String.format("/data/data/%s/databases/", BuildConfig.APPLICATION_ID);
    private static final int DATABASE_VERSION = 1;
    private static final String PASSWORD = "Testing Apps";

    private static DatabaseHelper sInstance;

    private Dao<Profile, Integer> profileDao;

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

        // Decrypt Database
        getWritableDatabase(getPassword());
    }

    @Override
    public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
        try {

            setNullDaoObject();

            TableUtils.createTableIfNotExists(connectionSource, Profile.class);



        } catch (SQLException | java.sql.SQLException e) {
            LogUtil.debug("Could not create new table: " + e);
        }
    }

    private void setNullDaoObject() {
        profileDao = null;
    }

    @Override
    public void onUpgrade(net.sqlcipher.database.SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion) {
        Log.d("DatabaseHelper", "onUpgrade: " + oldVersion + " to " + newVersion);

        try {
            onCreate(db, connectionSource);
        } catch (SQLException | java.sql.SQLException e) {
            LogUtil.debug("Could not create new table: " + e);
        }
    }

    @Override
    protected String getPassword() {
        return PASSWORD;
    }

    public static synchronized DatabaseHelper getInstance(Context context) {
        if (sInstance == null) {
            sInstance = new DatabaseHelper(context.getApplicationContext());
        }

        return sInstance;
    }
    public Dao<Profile, Integer> getProfileDao() {
        if (profileDao == null) {
            try {
                profileDao = getDao(Profile.class);
            } catch (java.sql.SQLException e) {
                LogUtil.debug("Failed get profileDao: " + e.getMessage());
            }
        }
        return profileDao;
    }

    @Override
    public void close() {
        setNullDaoObject();

        super.close();
    }

}

Инициализация библиотеки в App.java:

App.java

package com.devleoper.id;

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;

import net.sqlcipher.database.SQLiteDatabase;

/**
 * Created by developer on 11/14/18.
 */
public class App extends Application{

    @Override
    public void onCreate() {
        super.onCreate();

        // Iniitalize SQL Chiper
        SQLiteDatabase.loadLibs(this);

    }

}

я хочу вызвать вспомогательную базу данных на BaseActivity к другому действию

BaseActivity.java

public abstract class BaseActivity extends AppCompatActivity {

    public DatabaseHelper databaseHelper = null;

    @Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
    }

    /**
     * You'll need this in your class to get the helper from the manager once per class.
     */
    public DatabaseHelper getDatabaseHelper() {
        if (databaseHelper == null) {
            databaseHelper = DatabaseHelper.getInstance(this);
        }
        return databaseHelper;
    }


    /**
     * You'll need this in your class to release the helper when done.
     */
    public void releaseDatabaseHelper() {
        if (databaseHelper != null) {
            OpenHelperManager.releaseHelper();
            databaseHelper = null;
        }
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        // release DB
        releaseDatabaseHelper();
    }
}

MainActivity.class

public class MainActivity extends BaseActivity {


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

        try {
            // Get Data List Profile
            List<Profile> profiles = getBaseActivity().getDatabaseHelper().getProfileDao().queryForAll();
            if (profiles != null && profiles.size() > 0) {
                profile = profiles.get(0);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }        
    }

    @Override
    public void onBackPressed() {
    }



    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

}

Задача Я нашел проблему следующим образом:

  1. когда я получаю данные в первый раз, приложение данных может быть в списке MainActivity.java Размер списка 100 из Библиотека Ormlite-SQLChiper.
  2. Затем я нажимаю кнопку «Домой» в приложении, затем я нажимаю кнопка последних приложений для запуска приложений, чтобы принудительно / убить приложения.
  3. Затем я снова открываю приложение.
  4. Когда я получаю список данных в MainActivity.java, размер данных 0
  5. данные потеряны.

я хочу использовать для функции извлечения данных:

getBaseActivity().getDatabaseHelper().getProfileDao().queryForAll();

Есть ли решение этой проблемы? Моя кодировка неверна? или неверный для извлечения, когда приложение принудительно закрывается из последних приложений и вновь открывается.

Спасибо.

...