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后,原有数据库存放问题的解决。

时间: 2024-11-12 00:43:28

cpe移植到framework后,原有数据库存放问题的解决。的相关文章

MYSQL技巧|为了方便备份和安全,MySQL数据库存放目录如何更改?

本文标签:  MYSQL技巧 MySQL数据库   互联网杂谈 我们在安装玩MYSQL后,数据库存放目录默认是在MYSQL里面的,为了方便备份和安全,我们是有必要更改MySQL数据库存放目录的.那么,要怎么更改呢? 打开cmd命令提示符窗口,输入命令停止MySQL服务运行 net stop mysql 打开X:\Server_Core\MySQL\my.ini, 找到: Datadir = "X:\Server_Core\MySQL\data" 修改为: Datadir = "

cpe移植framework后,。解决问题的现有数据库

最近,该公司的业务需求,原始订单apk的形式CPE.渗透framework层.这被剥离cpe,从事相当长的一段,终于有时间来写博客,记下遇到的问题,未来. 第一个问题是,原来的apk有些事情,移植framework层后,.不同的环境,我们必须做出一些改变. 比如, 1.ContentProvider,因没有提供给其它程序数据共享,要么去掉.所有改为sqlite直接调用.要么把这个ContentProvider剥离出来.形成一个apk.固定到framework.给cpe提供ContentProvi

使用Entity Framework迁移完数据库后,每次修改代码(非模型代码)后都报错。

问题:使用Entity Framework迁移完数据库后,每次修改代码(非模型代码)后都报错: 支持“XXXDbContext”上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269). 这时如果执行 Add-Migration 生成的迁移代码是空的.于是重新Update-Database,结果却是No pending explicit migrations. 不过这时是不

如何移植.NET Framework项目至.NET Core?

公司的项目一直采用.NET框架来开发Web项目.目前基础类库均为.NET Framework 4.6.2版本.Caching, Logging,DependencyInjection,Configuration等基础设施相关的依赖库一直和官方保持同步,目前是1.1版本..NET Core越来越趋于稳定,新的开发工具也在三月份发布.因此,计划将.NET Framework移植至.NET Core/Strandard.目的是使基于.NET开发的Web应用可以跨平台运行. 按应用场景将公司的项目分为基

Windows重新安装系统后Oracle数据库恢复

一.前言 由于某些原因,导致Windows操作系统需要重新安装,通常情况下系统盘都是C盘,数据库安装到D盘或者其他盘符,切勿与系统盘存放在一起.系统重新安装以后,我们需要恢复数据库. 二.系统安装前准备 在系统安装之前,我们需要先关闭监听和数据库,最好做一个备份.具体操作步骤如下 1.关闭监听 lsnrctl stop 2.关闭数据库 shutdown immediate; 3.备份整个数据库安装目录 如果空间允许的话,使用复制-粘贴命令即可,或者可以做一个压缩备份. 因为是Windows系统,

Entity Framework Code First数据库迁移(DB Migration)

一.手动迁移 第1步.启用数据库迁移 打开程序包管理器控制台 工具->库程序包管理器->程序包管理器控制台 打开控制台后,在控制台管理窗口输入 Enable-Migrations 指令,铵下回车键,到这里已启用了数据库迁移,但还没执行,结果如下图: 第2步.运行数据库迁移 在控制台管理窗口输入 Add-Migration指令,来新增一条数据库迁移版本,输入时必须要带上一个版本名称 Add-Migration AddProductCategoryTypeName,如下图: 运行完成后会在解决方案

EF6 在原有数据库中使用 CodeFirst 总复习(五、生成发帖页面)

有点与在原有数据库中使用 CodeFirst 远了,不过是总复习吗,总得全面点. 一.在用户表(Users)中插入两个用户 二.生成发帖界面 MVC生成的界面很多,也没使用Ajax,实际开发中很少会使用,这里只是为了演示. 但无论用什么生成,特性.实体对象等都是要用到的. 生成之前要编译一下. 三.先试试看能不能运行 空空如也 应该显示用户名,显示成登陆名了(其实预想的是不在新增和修改时显示,未考虑到列表),删除标记怎么也显示出来了,还有内容,能显示的下吗... 四.列显示问题 让列表显示用户,

EF6 在原有数据库中使用 CodeFirst 总复习(一、搭建基础环境)

本来以为已经会了,可动手时发现许多问题还是模糊不清,正所谓眼高手低.只能重新查资料,再复习一遍. vs.net2013 ef6 mvc5 sqlserver2008 一.建立数据库  Blogging 二.创建表,插入测试数据 CREATE TABLE [dbo].[Blogs] (     [BlogId] INT IDENTITY (1, 1) NOT NULL,     [Name] NVARCHAR (200) NULL,     [Url] NVARCHAR (200) NULL,  

Robot Framework操作MySQL数据库和Oracle数据库

一.Robot Framework连接MySQL数据库 1.安装databaselibrary.pymsql 通过cmd命令执行pip install robotframework-databaselibrary==1.1.1,安装指定版本 通过cmd命令执行pip install PyMySQL==0.9.2 2.导入DatabaseLibrary包到Robotframework 3.使用关键字对数据库进行操作 连接数据库关键字:Connect To Database Using Custom