最近,该公司的业务需求,原始订单apk的形式CPE。渗透framework层。这被剥离cpe,从事相当长的一段,终于有时间来写博客,记下遇到的问题,未来。

第一个问题是,原来的apk有些事情,移植framework层后,。不同的环境,我们必须做出一些改变。

比如,

1.ContentProvider,因没有提供给其它程序数据共享,要么去掉。所有改为sqlite直接调用。要么把这个ContentProvider剥离出来。形成一个apk。固定到framework。给cpe提供ContentProvider.

2.SharedPreferences,打入framework后,SharedPreferences没有地方存放由它生成的xml文件,因此也要去掉,去掉后怎样保存它要保存的数据呢,比如终端启动信息和初始化信息等。终于确定使用一个文件来保存。依赖于Properties这个工具类读写数据,Properties最初还遇到了写数据的问题,后来还是攻克了。主要是        mProperties.setProperty(name,value);仅仅是把数据写入内存,而没有写入到文件,纠结了半天,改动了一下代码。ok了。

try {

            os=new FileOutputStream(CONFIGPATH);

            

            mProperties.setProperty(name,value);

            mProperties.store(os, null);  

        } catch (Exception e) {

            e.printStackTrace();

        }  finally{

            try {

                os.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

3.CPE原有的配置文件。在framework层后,文件夹结构不一样,得找个地方存放这些配置文件。改动了引用这些配置文件所在文件夹,最后统一移植到/system/etc/cpe/文件夹下。

4.CPE依赖的第三方jar包,CPE打入framework后,其本身就是一个jar形式存在,仅仅只是由SystemService传入Context其它它。那么CPE所依赖的第三方jar包也得进入framework,開始的时候所有导入到framework,编译并执行后。发现板子上还有一个apk也引用了我导入的CPE jar,冲突了。为了避免这个问题。决定改动CPE的包名。

5.如同SharedPreferences,apk生成的db文件。默认在/data/data/包名/database/文件夹下。而打入framework后。db文件得找个地方存放,为了解决问题,查找了非常多资料,測试了半天,最终实现了,并将db文件存放在/data/cpe/文件夹下。由于是apk在測试时候,没打入framework,板子上的文件夹是没有权限写数据的,仅仅能用U盘做測试,写入/sdcard/文件夹下測试的。说了半天。即指定文件夹存放db文件。

定义帮助类继承SQLiteOpenHelper:

public class DatabaseHelper extends SQLiteOpenHelper

构造方法:

private static final String PATH ="/sdcard/cpe";

public DatabaseHelper(Context context, String name) {

        super(new CustomPathDatabaseContext(context, PATH), name, null, VERSION);

    }

注意构造方法中的CustomPathDatabaseContext.java:

public class CustomPathDatabaseContext extends ContextWrapper{

    

    private static final String TAG = CustomPathDatabaseContext.class.getSimpleName();



    private String mDirPath;

    public CustomPathDatabaseContext(Context base,String name) {

        super(base);

        mDirPath = name;

    }

    

    @Override

    public File getDatabasePath(String name) {

        File result = new File(mDirPath + File.separator + name);

        if (!result.getParentFile().exists())

        {

            result.getParentFile().mkdirs();

        }

        return result;

    }

    

    @Override

    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory)

    {

        Log.d(TAG, "openOrCreateDatabase");

        return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);

    }

    @Override

    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory, DatabaseErrorHandler errorHandler){

        Log.d(TAG,"openOrCreateDatabase...");

        return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name).getAbsolutePath(), factory, errorHandler);

    }

}

为什么要这样定义。查看源代码,ContextWrapper就是Context的实现类。在getReadableDatabase(),或getWriteableDatabase()调用后,会运行openOrCreateDatabase(),4.0版本号后运行第二个openOrCreateDatabase(),这指定db夹。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

cpe移植framework后,。解决问题的现有数据库的更多相关文章

  1. Zend Framework 2参考Zend\Authentication(数据库表认证)

    + 转载自:Zend Framework 2参考Zend\Authentication(数据库表认证) 介绍 Zend\Authentication\Adapter\DbTable提供对存储在数据库表 ...

  2. asp.net core 系列 21 EF现有数据库进行反向工程

    一.概述 在上篇中使用EF基于数据模型创建数据库,  本篇继续使用 EF  基于数据库创建数据模型.  实现对已有数据库进行反向工程,来构建数据访问的 ASP.NET Core MVC 应用程序.已有 ...

  3. 通过 NewLife.XCode 迁移任意现有数据库到任意数据库

    通过 NewLife.XCode 迁移任意现有数据库到任意数据库(附分表分库方法) 本文背景是将其他系统的数据库迁移到另一个数据库(仅需 20 行代码),也可以作为项目迁移用,生成自己系统的专属实体代 ...

  4. (18)ASP.NET Core 基于现有数据库创建EF模型(反向工程)

    1.简介 Entity Framework Core可通过数据库提供给应用程序的插件访问许多不同的数据库.我们可以通过使用Entity Framework Core构建执行基本数据访问的ASP.NET ...

  5. Asp.Net 应用程序在IIS发布后无法连接oracle数据库问题的解决方法

    asp.net程序编写完成后,发布到IIS,经常出现的一个问题是连接不上Oracle数据库,具体表现为Oracle的本地NET服务配置成功:用 pl/sql 等工具也可以连接上数据库,但是通过浏览器中 ...

  6. 电脑重装系统后如何恢复Mysql数据库

    电脑重装系统后如何恢复Mysql数据库 一.[设置mysql的path]

  7. 基于现有数据库的Code First模式迁移更新数据库

    本文讨论的内容是基于EF4.1版本.文中谈论的现有的数据库不是由EF创建.本文假定你已经对Code First迁移有一定的了解,如果不了解Code First迁移更新数据库可以查看 文章涉及的主题如下 ...

  8. STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085和串口只发送数据不能接收数据问题

    STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085的问题讨论:http://www.rt-thr ...

  9. Web安全--使用Salt + Hash将密码加密后再存储进数据库

    转载原地址 http://www.bozhiyue.com/mianshiti/_net/2016/0728/314239.html (一) 为什么要用哈希函数来加密密码 如果你需要保存密码(比如网站 ...

随机推荐

  1. 树——axure线框图部件库介绍

    终于到最后一个组件的介绍了!到这里基础的应用应该算完成了!  1. 拖动树组件,到页面编辑区域  2.添加节点,可以添加子节点也可以在该节点的前后添加平级节点  3. 编辑节点图标 做好上面的那一步, ...

  2. HBase零基础高阶应用实战(CDH5、二级索引、实践、DBA)

    HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”.就像Bigtable利用了Google文件 ...

  3. ubuntu 10.04安装qtcreator并汉化

    最近最的项目中需要做出来一个带有界面的demo,所以想到了用qt做个简单的demo! 于是在ubuntu上安装了qt,很简单apt-get apt-get install qtcreator 大概几百 ...

  4. Theano学习笔记(二)——逻辑回归函数解析

    有了前面的准备,能够用Theano实现一个逻辑回归程序.逻辑回归是典型的有监督学习. 为了形象.这里我们如果分类任务是区分人与狗的照片. 首先是生成随机数对象 importnumpy importth ...

  5. js实现表格的选中一行-------Day58

    最開始想很多其它的用js来动态操作表格,是由于在应用了easyUI之后,发现直接写一个<table id="tt"></table>,这就够了,界面里面就剩 ...

  6. asp.net笔试题

    1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成 ...

  7. Direct UI 思想阐述(好多相关文章)

    在界面开发中,目前DirectUI是个热门的技术名称,因为众多的知名公司都是用DirectUI方式作出了很炫丽的界面.而对于大多数熟悉Win32控件,熟悉MFC开发的开发人员来说,我们应该做何选择? ...

  8. okHttp封装使用

    package com.zhy.utils.http.okhttp; import android.graphics.Bitmap; import android.graphics.BitmapFac ...

  9. TPL异步并行编程之任务超时

    此处参考自阿涛的博文:http://www.cnblogs.com/HelloMyWorld/p/5526914.html 一 自己定义 基本的思路: net中异步操作由于是交给线程来实现,因此不可能 ...

  10. jsp:include怎么设置才能正确显示包含的页面呢

    1.项目的所有jsp都放在WEB-INF文件夹之下,使用的是SpirngMVC进行了过滤,jsp:include只能引入WEB-INF外部的jsp文件,对于改变后缀显示为htm的jsp的WEB-INF ...