zoukankan      html  css  js  c++  java
  • Android 数据库SQLite 写入SD卡

    如果手机没有root,数据库文件是无法查看到的,不方便调试。

    最好的办法是把数据库写进SD卡。

    修改的地方有两处:

    1.在你的helper类中把数据库文件名称 DATABASE_NAME 由原来的一个文件名,修改成路径的形式。

    修改前:DATABASE_NAME = "demo.db"

    public class MyDBHelper extends SQLiteOpenHelper {
        public static final int VERSION = 1;        //数据库版本号
        public static final String DATABASE_NAME = "demo.db";       //数据库名称
        public static final String TABLE_NAME = "mytag";        //数据表名称,一个数据库可以包含多张数据表,类似于excel中的sheet1,sheet2
    
        //MyDBHelper 的构造函数,我们关心的是名称DATABASE_NAME和版本VERSION
        public MyDBHelper(Context context) {
            super(context, DATABASE_NAME, null, VERSION);
        }

    修改后:DATABASE_NAME = "/mnt/sdcard/demo.db"

    public class MyDBHelper extends SQLiteOpenHelper {
        public static final int VERSION = 1;        //数据库版本号
        public static final String DATABASE_NAME =  "/mnt/sdcard/demo.db";       //数据库名称
        public static final String TABLE_NAME = "mytag";        //数据表名称,一个数据库可以包含多张数据表,类似于excel中的sheet1,sheet2
    
        //MyDBHelper 的构造函数,我们关心的是名称DATABASE_NAME和版本VERSION
        public MyDBHelper(Context context) {
            super(context, DATABASE_NAME, null, VERSION);
        }

    因为如果只是一个单独的文件名,最后创建的数据库文件就是保存在手机内部存储卡(不是运行内存,也不是SD卡)的/data/data/包名称/databases 目录下,而没有root的手机,这个/data根文件夹是进不去的,用adb shell方式也打不开。

    如果想把数据库文件.db保存到SD卡 某个目录中,则先要检测该目录是否存在,不存在则要创建。可以在MyApplication中完成这项初始化操作:

    /**
     * 在这里进行(1)ImageLoader的全局配置
     * (2)数据库目录的创建
     * (3)定义全局常量
     * Created by LiChong on 2016/4/29.
     */
    public class MyApplication extends Application {
        //全局常量
        public static final String DBDir = Environment.getExternalStorageDirectory() + File.separator
                + "MyDressingHelper" + File.separator
                + "databases" + File.separator;         //数据库所在目录
    
        @Override
        public void onCreate(){
            super.onCreate();
            Log.d("mylog", "进入Application的onCreate(),Application的onCreate()是App最先执行的部分所以可以在这里进行整个应用的相关初始化");
    
            //初始化ImageLoader的全局配置
            initImageLoader(getApplicationContext());
    
            //初始化数据库配置
            File dir = new File(DBDir);       //检测数据库目录是否存在,不存在则创建
            if(!dir.exists()){
                dir.mkdirs();
            }
        }
    
        //ImageLoader全局配置
        public static void initImageLoader(Context context){
            ImageLoaderConfiguration imageLoaderConfiguration = new ImageLoaderConfiguration.Builder(context)
                    .threadPriority(Thread.NORM_PRIORITY - 2)
                    .denyCacheImageMultipleSizesInMemory()
                    .diskCacheFileNameGenerator(new Md5FileNameGenerator())
                    .diskCacheFileCount(20)     //缓存文件数量
                    .tasksProcessingOrder(QueueProcessingType.LIFO)
                    .build();       //开始构建
            ImageLoader.getInstance().init(imageLoaderConfiguration);   //全局初始化配置ImageLoader
        }
    }

    建立了自己的Application类后还要在Manifest中添加它的名字才能启动:

        <application
            android:name=".MyApplication"

    2.最后,千万别忘了修改权限!

    Android手机是有着严格的安全管控的,SD卡属于外部存储器,访问上面的文件需要添加权限。

    在AndroidManifest.xml 中添加两条SD卡读写权限即可:

        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

     如果没有添加权限,那么程序就会异常终止。

  • 相关阅读:
    拷贝构造函数 转型构造函数
    构造函数对const成员的初始化
    拷贝构造函数
    类数据成员和类成员函数
    顶层函数进行操作符重载与操作符重载直接作为类的构造函数
    构造函数和new 与new【】 析构函数
    Openfire+XIFF实时通信&一个特殊的GP
    客户端数据动态渲染
    数据处理:由面得点,构造其边界
    从GISALL博客搬家而来
  • 原文地址:https://www.cnblogs.com/Chongger/p/5341784.html
Copyright © 2011-2022 走看看