cpe移植framework后,。解决问题的现有数据库
最近,该公司的业务需求,原始订单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后,。解决问题的现有数据库的更多相关文章
- Zend Framework 2参考Zend\Authentication(数据库表认证)
+ 转载自:Zend Framework 2参考Zend\Authentication(数据库表认证) 介绍 Zend\Authentication\Adapter\DbTable提供对存储在数据库表 ...
- asp.net core 系列 21 EF现有数据库进行反向工程
一.概述 在上篇中使用EF基于数据模型创建数据库, 本篇继续使用 EF 基于数据库创建数据模型. 实现对已有数据库进行反向工程,来构建数据访问的 ASP.NET Core MVC 应用程序.已有 ...
- 通过 NewLife.XCode 迁移任意现有数据库到任意数据库
通过 NewLife.XCode 迁移任意现有数据库到任意数据库(附分表分库方法) 本文背景是将其他系统的数据库迁移到另一个数据库(仅需 20 行代码),也可以作为项目迁移用,生成自己系统的专属实体代 ...
- (18)ASP.NET Core 基于现有数据库创建EF模型(反向工程)
1.简介 Entity Framework Core可通过数据库提供给应用程序的插件访问许多不同的数据库.我们可以通过使用Entity Framework Core构建执行基本数据访问的ASP.NET ...
- Asp.Net 应用程序在IIS发布后无法连接oracle数据库问题的解决方法
asp.net程序编写完成后,发布到IIS,经常出现的一个问题是连接不上Oracle数据库,具体表现为Oracle的本地NET服务配置成功:用 pl/sql 等工具也可以连接上数据库,但是通过浏览器中 ...
- 电脑重装系统后如何恢复Mysql数据库
电脑重装系统后如何恢复Mysql数据库 一.[设置mysql的path]
- 基于现有数据库的Code First模式迁移更新数据库
本文讨论的内容是基于EF4.1版本.文中谈论的现有的数据库不是由EF创建.本文假定你已经对Code First迁移有一定的了解,如果不了解Code First迁移更新数据库可以查看 文章涉及的主题如下 ...
- 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 ...
- Web安全--使用Salt + Hash将密码加密后再存储进数据库
转载原地址 http://www.bozhiyue.com/mianshiti/_net/2016/0728/314239.html (一) 为什么要用哈希函数来加密密码 如果你需要保存密码(比如网站 ...
随机推荐
- 小细节--Extjs中,renderTo 和applyTo的区别
说到web前端框架,extjs绝对算是非常优秀的一个. extjs中,两个方法很像,renderTo和applyTo,我在网上也搜了很多相关的内容,在这里举例为大家进行区分,欢迎大家交流指正. 主要区 ...
- android文件下载大小和网络不一致(偏大)
今天在写一个文件下载的程序,在网上搜索了一个抄,用来下载MP3文件. 但是发现下载的MP3文件比原来的文件要大,而且MP3中会有杂音. 在Log中加入日志后发现: 从 网络流中获取的流长度为3000 ...
- 创建webservice 用service.xml配置(复杂点的方法)
用Axis2实现Web Service,虽然可以将POJO类放在axis2/WEB-INF/pojo目录中直接发布成Web Service,这样做不需要进行任何配置,但这些POJO类不能在任何包中.这 ...
- ufldl学习笔记和编程作业:Feature Extraction Using Convolution,Pooling(卷积和汇集特征提取)
ufldl学习笔记与编程作业:Feature Extraction Using Convolution,Pooling(卷积和池化抽取特征) ufldl出了新教程,感觉比之前的好,从基础讲起.系统清晰 ...
- RobotFramework 数据分离
RobotFramework 数据分离分为三种 1. Run 添加参数 2. 外部的Python文件 3. 读取Excel Run 添加参数 (适用于jenkins) 使用-v 参数名:参数值 使用外 ...
- 我觉得主要靠积累,难度不是问题,主要靠时间积累,以及兴趣带来的学习能力(我觉得至少5年全职Qt开发经验,才能算精通)
顺便想请教一下,你用QT有几年了? 3年不到 那感觉怎么样?是比较难,还是不难但需要时间才能掌握全部? 很多东西真的要拿来做项目了,才会懂.要靠积累.一开始看看理论貌似都很简单. 但是QT和C++本身 ...
- 基础知识(10)- 部署应用程序和applet
10.1 JAR文件 10.1.1 清单文件 10.1.2 可运行JAR文件 10.1.3 资源 10.1.4 密封 10.2 Java Web Start 10.2.1 沙箱 10.2. ...
- css hack 如何区分 ie7 ie8
.style { width:100px; /*火狐以及一般浏览器*/ width:200px\9; /*IE8*/ *width:150px; /*IE7*/ _width:50px; /*IE6* ...
- Swift - 数组排序方法(附样例)
下面通过一个样例演示如何对数组元素进行排序.数组内为自定义用户对象,最终要实现按用户名排序,数据如下: 1 2 3 4 var userList = [UserInfo]() userList.app ...
- SQL--存储过程+触发器 对比!
一.存储过程 一:存储过程:存储过程是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中. 可以用存储过程名字和参数来调用存储过程,这样可以避免代码重复出现,用起来也方便. 例: 下面 ...