如何使Android应用程序在卸载应用程序时不删除sqlite数据库,以便我下次安装应用程序时可以使用该数据库?

时间:2018-12-21 04:52:18

标签: android sqlite

我已经制作了可以在离线模式下运行的android应用,并且我不想在应用取消关联后丢失数据。enter code here

4 个答案:

答案 0 :(得分:1)

您可以将数据库放置在外部存储中

您还将需要适当的权限才能使用外部存储

  • 请注意,该代码假设用户授予API 23+权限。

这是一个简单的工作示例,该文件将名为 mydb.db 的数据库存储在名为 mydatabases 的文件夹中的外部存储中,它在名为的表中保存了几行> mytable 。如果该应用程序已卸载,则数据仍然保留。

  • (请注意,用户可能可以删除数据库)

第一个用于处理API 23+设备上的请求权限的类 ExternalStoragePermissionsRequest.java

class ExternalStoragePermissionsRequest {

    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    public ExternalStoragePermissionsRequest() {}
    // Note call this method
    public static void verifyStoragePermissions(Activity activity) {

        int permission = ActivityCompat.checkSelfPermission(
                activity,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);

        if(permission != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                    activity,
                    PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE
            );
        }
    }
}

数据库帮助程序 DatabaseHelper.java :-

public class DatabaseHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "mydb.db";
    public static final int DBVERSION = 1;
    public static final String TBL_MYTABLE = "mytable";
    public static final String COL_MYTABLE_ID = BaseColumns._ID;
    public static final String COL_MYTABLE_MYDATA = "mydata";

    SQLiteDatabase mDB;

    public DatabaseHelper(Context context) {
        super(context,
                Environment.getExternalStorageDirectory() + File.separator + "mydatabases" + File.separatorChar + DBNAME,
                null,
                DBVERSION
        );
        mDB = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String crt_sql = "CREATE TABLE IF NOT EXISTS " + TBL_MYTABLE + "(" +
                COL_MYTABLE_ID + " INTEGER PRIMARY KEY," +
                COL_MYTABLE_MYDATA + " TEXT " +
                ")";
        db.execSQL(crt_sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }

    public long insert(String mydata) {
        ContentValues cv = new ContentValues();
        cv.put(COL_MYTABLE_MYDATA,mydata);
        return mDB.insert(TBL_MYTABLE,null,cv);
    }

    public void logData() {
        Cursor csr = mDB.query(TBL_MYTABLE,null,null,null,null,null,null);
        DatabaseUtils.dumpCursor(csr);
        csr.close();
    }
}
  • 注意对 super 方法的调用的第二个参数。

最后一个调用活动(假定为第一个/初始/主要) MainActivity.java

public class MainActivity extends AppCompatActivity {

    DatabaseHelper mDBHlpr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if(Build.VERSION.SDK_INT >= 23) {
            ExternalStoragePermissionsRequest.verifyStoragePermissions(this);
        }
        mDBHlpr = new DatabaseHelper(this);
        mDBHlpr.logData();
        if (DatabaseUtils.queryNumEntries(mDBHlpr.mDB,DatabaseHelper.TBL_MYTABLE) < 1) {
            mDBHlpr.insert("Somedata001");
            mDBHlpr.insert("Somedata002");
        }
        mDBHlpr.logData();
    }
}
  • 请注意,最好检查一下是否可以安全卸载(使用外部存储的免责声明),插入数据的两行应注释掉。

该日志应在首次运行时以及在卸载应用程序并按建议注释掉行后运行时应包括:-

12-21 06:47:55.306 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@53442310
12-21 06:47:55.306 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out: 0 {
12-21 06:47:55.306 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out:    _id=1
12-21 06:47:55.306 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out:    mydata=Somedata001
12-21 06:47:55.306 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out: }
12-21 06:47:55.306 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out: 1 {
12-21 06:47:55.306 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out:    _id=2
12-21 06:47:55.306 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out:    mydata=Somedata002
12-21 06:47:55.306 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out: }
12-21 06:47:55.306 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out: <<<<<
12-21 06:47:55.306 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@5343da94
12-21 06:47:55.310 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out: 0 {
12-21 06:47:55.310 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out:    _id=1
12-21 06:47:55.310 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out:    mydata=Somedata001
12-21 06:47:55.310 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out: }
12-21 06:47:55.310 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out: 1 {
12-21 06:47:55.310 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out:    _id=2
12-21 06:47:55.310 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out:    mydata=Somedata002
12-21 06:47:55.310 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out: }
12-21 06:47:55.310 2671-2671/so53879343esdb.so53879343externalstoragedb I/System.out: <<<<<

答案 1 :(得分:0)

只需在外部存储中创建数据库,如下所示

public DatabaseHelper(final Context context) {
    super(context, Environment.getExternalStorageDirectory()
            + File.separator + FILE_DIR
            + File.separator + DATABASE_NAME, null, DATABASE_VERSION);
}

即使您卸载应用,它也不会删除

答案 2 :(得分:-1)

以下步骤对您有帮助:

-您可以创建外部SQLITE数据库并将其放入我们的资产文件夹。

-您可以在首次安装应用程序时从数据库中获取数据。

如有疑问,请随时询问。

答案 3 :(得分:-1)

SQlite数据库只是文件,它们(默认情况下)存储在应用程序的专用数据区域(/ data / data / $ PACKAGENAME / databases)中。卸载应用程序后,将删除这些文件。解决方案的解决方案是在SDCard上创建数据库。

看看this