android数据存储
2016-01-20 10:17
453 查看
(掌握)junit单元测试
1 概念介绍
junit测试就是单元测试。
对于业务逻辑代码进行测试,也就是对于service层进行测试
测试目标:方法
1 测试方法的执行是否成功。
2 测试方法的返回值是否成功。(断言测试)
2 执行步骤
执行单元测试:
1 导入测试库
2 配置测试启动类
3 写一个类继承AndroidTestCase
编写测试类的时候需要注意命名的规范
进入
一定要进入的是测试类
选择方法右击:run as --> android junit test
清单文件的很多节点是有顺序的。
3 单独的测试工程
测试代码可以写在同一应用程序里面,也可以写一个单独的测试工程。
步骤:
1 new
2 选择要测试的工程
3 测试的配置文件会自动生成,只需要编写测试代码
(掌握)logcat使用
日志猫
如果在android应用程序中打印日志,它不会在console控制台输出。
程序是运行在android系统。
linux 最牛x 安全 他的权限控件很好。
rwx:
r:read 可读
w:write 可写
x:可执行
第一位:d - l
d:目录
-:文件
l:指向
(掌握)数据存储的方式
(掌握)文件保存例子
android系统的根目录:/
(掌握)sd卡存储
sdcard的路径:/sdcard /mnt/sdcard
面试题:
sdcard的路径随着系统的改变会变化 或者手机定制商也会修改。所有要多使用常量
获取sdcard路径
判断sdcard是否存在
写sdcard是需要权限的。
android 4.4 增加了权限:
sdcard读都是需要权限
(掌握)文件访问权限
android为了api的完整性。
打开文件
把数据写入文件
在/data/data/包名/创建一个文件夹files 再在files文件夹里面创建对应的文件
mode:文件的操作模式
界面
核心代码
(掌握)android xml的描述
xml?
w3c公司提出的标准。xml:数据的存储 配置 网络间数据的传递
组成:标签 属性 。java j2ee
android:重新描述了xml
(掌握)xml文件系列化
对象集合 --》xml
xml解析:dom:一次全部加载 dom4j sax 基于事件
pull 解析:基于事件
模板代码
首选项
存储软件的配置信息:
window ini
android xml
1 自动登录
2 聊天 信息来了 。。。 很小
首选项不能存在太多的信息。 特点:当程序运行首选项里面的数据会全部加载进内容
存储的是私有的数据,并且数据形式是键值对。
(掌握)查看Settings的源码 获取sdcard的大小
Settings:设置应用
1 自动登录
2 聊天 信息来了 。。。 很小
首选项不能存在太多的信息。 特点:当程序运行首选项里面的数据会全部加载进内容
框架层
上层应用所有的源
查看源码:最好是把对应项目的代码导入到Eclipse
搜索 search File才可以
格式化 工具类
StatFs:对于硬盘空间的描述类
大家看源码。
通过search来找代码
(了解)sqlite数据库
嵌入式的数据库,体积小 功能强大
几十kb. 嵌入式设备上:计算器 手表
iso:Sqlite数据库
在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,但是主键只能是Integer类型的。
Sqlite数据库一般要求主键是_id,当然也可以是id.
原来:数据库
安装一个数据库的软件。
android里面的数据库是由底层的sqilte.c的代码来动态生成的。
(了解)sqlite3工具的使用
双加 --》next ....
不要对其进行升级处理。
用来查看数据库的客户端
(掌握)android数据库的创建
android系统封装了一个类SqliteOpenHelper
工具类:
获取数据库对象
/**
* 数据库的工具类
* 一般:用单例模式
* 把构造方法私有化 ,对外要提供一个方法 获取其他实例
* @author apple
*
*/
public class MySqliteOpenHelper extends SQLiteOpenHelper {
private static SQLiteOpenHelper mInstance;
/**
*
* @param context 上下文 打开或者创建数据库
* @param name 数据库的名字 要以.db结尾
* @param factory 游标工厂:创建游标对象
* @param version 数据库的版本号 如果版本号不同 执行onUpgrade()方法:数据库的升级
*/
private MySqliteOpenHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
//对外提供的方法
public static synchronized SQLiteOpenHelper getInstance(Context context){
if(mInstance == null){
mInstance = new MySqliteOpenHelper(context, "wuhan06.db", null, 1);
}
return mInstance;
}
/**
* 创建数据库里面的表 或者对表里面的数据执行初始化
* 创建一张表:person 字段:id(不标准) 最好是使用_id 唯一标示 主键 自增
* name
*/
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table person(_id integer primary key autoincrement,name text)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}增 删 查 改 实现
package cn.itcast.wh08.sqlite;
import cn.itcast.wh08.sqlite.db.MySqliteOpenHelper;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private SQLiteOpenHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取数据库的帮助类
helper = MySqliteOpenHelper.getIntance(this);
}
public void get(View v){
helper.getReadableDatabase();//问SQLiteOpenHelper要数据库 判断:数据库是否存在,如果存在就打开,否则创建
}
//插入
public void insert(View v){
//获取可写的数据库
SQLiteDatabase db = helper.getWritableDatabase();
//判断数据库是否打开
if(db.isOpen()){
//执行sql
db.execSQL("insert into persons(name) values('小鸡哥')");
//关闭数据库
db.close();
}
}
//查询
public void query(View v){
SQLiteDatabase db = helper.getReadableDatabase();
if(db.isOpen()){
//查询 获取游标(ResultSet是一样的只是名字不同)
Cursor cursor = db.rawQuery("select * from persons", null);
//迭代游标
while(cursor.moveToNext()){
//获取数据
// int _id = cursor.getInt(0);
//cursor.getColumnIndex("_id") 获取_id在cursor里面的下标
int _id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(1);
Log.i(TAG, "_id:"+_id+",name:"+name);
}
cursor.close();//关闭游标
db.close();
}
}
//更新
public void update(View v){
//获取可写的数据库
SQLiteDatabase db = helper.getWritableDatabase();
//判断数据库是否打开
if(db.isOpen()){
//执行sql
db.execSQL("update persons set name =? where _id = ?", new Object[]{"小覃",1});
//关闭数据库
db.close();
}
}
//删除
public void delete(View v){
//获取可写的数据库
SQLiteDatabase db = helper.getWritableDatabase();
//判断数据库是否打开
if(db.isOpen()){
//执行sql
db.execSQL("delete from persons where _id = ?", new Object[]{1});
//关闭数据库
db.close();
}
}
}
(掌握)利用sql语句对数据库增删改查
SQLite可以解析大部分标准SQL语句,如:
查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
如:select * from person
select * from person order by id desc
select name from person group by name having count(*)>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘传智’,3)
更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘传智‘ where _id=10
删除语句:delete from 表名 where 条件子句。如:delete from person where _id=10
1 概念介绍
junit测试就是单元测试。
对于业务逻辑代码进行测试,也就是对于service层进行测试
测试目标:方法
1 测试方法的执行是否成功。
2 测试方法的返回值是否成功。(断言测试)
2 执行步骤
执行单元测试:
1 导入测试库
2 配置测试启动类
3 写一个类继承AndroidTestCase
编写测试类的时候需要注意命名的规范
进入
一定要进入的是测试类
选择方法右击:run as --> android junit test
清单文件的很多节点是有顺序的。
3 单独的测试工程
测试代码可以写在同一应用程序里面,也可以写一个单独的测试工程。
步骤:
1 new
2 选择要测试的工程
3 测试的配置文件会自动生成,只需要编写测试代码
(掌握)logcat使用
日志猫
如果在android应用程序中打印日志,它不会在console控制台输出。
程序是运行在android系统。
•(掌握)android的文件系统
android文件系统 基于Linuxlinux 最牛x 安全 他的权限控件很好。
rwx:
r:read 可读
w:write 可写
x:可执行
第一位:d - l
d:目录
-:文件
l:指向
(掌握)数据存储的方式
(掌握)文件保存例子
android系统的根目录:/
(掌握)sd卡存储
sdcard的路径:/sdcard /mnt/sdcard
面试题:
sdcard的路径随着系统的改变会变化 或者手机定制商也会修改。所有要多使用常量
获取sdcard路径
判断sdcard是否存在
写sdcard是需要权限的。
android 4.4 增加了权限:
sdcard读都是需要权限
(掌握)文件访问权限
android为了api的完整性。
打开文件
把数据写入文件
在/data/data/包名/创建一个文件夹files 再在files文件夹里面创建对应的文件
mode:文件的操作模式
界面
核心代码
public void onClick(View v) { String name = null;//文件名称 int mode = 0;//操作模式 switch (v.getId()) { case R.id.bt_private: name="private.txt"; mode = Context.MODE_PRIVATE; break; case R.id.bt_append: name = "append.txt"; mode = Context.MODE_APPEND; break; case R.id.bt_wr: name="wr.txt"; mode=Context.MODE_WORLD_READABLE; break; case R.id.bt_ww: name = "ww.txt"; mode=Context.MODE_WORLD_WRITEABLE; break; case R.id.bt_wr_ww: name="wrw.txt"; mode=Context.MODE_WORLD_READABLE|Context.MODE_WORLD_WRITEABLE; break; default: break; } try { FileOutputStream fos = openFileOutput(name, mode); String content = "abcdefghijklmnopqrstuvwxyz"; fos.write(content.getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } }执行结果
(掌握)android xml的描述
xml?
w3c公司提出的标准。xml:数据的存储 配置 网络间数据的传递
组成:标签 属性 。java j2ee
android:重新描述了xml
(掌握)xml文件系列化
对象集合 --》xml
public void create(View v){ try { List<PersonInfo> infos = new ArrayList<PersonInfo>(); infos.add(new PersonInfo(1, "冠希哥", 32)); infos.add(new PersonInfo(2, "霆锋", 32)); //把对象集合变成xml //xml序列化器 XmlSerializer serializer = Xml.newSerializer();//使用接口去接收一个真实的对象 FileOutputStream os = openFileOutput("persons.xml", Context.MODE_PRIVATE); serializer.setOutput(os, "utf-8");//指定数据输出的路径 serializer.startDocument("utf-8", true);//文档的开始 serializer.startTag(null, "persons");//标签的开始 for(PersonInfo info:infos){ serializer.startTag(null, "person"); serializer.attribute(null, "id", info.id+"");//属性 //name serializer.startTag(null, "name"); serializer.text(info.name);//文本节点 serializer.endTag(null, "name"); //age serializer.startTag(null, "age"); serializer.text(info.age+""); serializer.endTag(null, "age"); serializer.endTag(null, "person"); } serializer.endTag(null, "persons");//标签的结束 serializer.endDocument();//文档的结束 os.close();//关流 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }(掌握)xml文件解析
xml解析:dom:一次全部加载 dom4j sax 基于事件
pull 解析:基于事件
模板代码
public void parse(View v){ List<PersonInfo> infos = null; PersonInfo info = null; try { //获取解析器 XmlPullParser parser = Xml.newPullParser(); FileInputStream inputStream = openFileInput("persons.xml"); parser.setInput(inputStream, "utf-8");//把流设置给解析器 int eventType = parser.getEventType();//获取事件类型 while(eventType != XmlPullParser.END_DOCUMENT){//判断是否解析到了文档的结尾 switch (eventType) { case XmlPullParser.START_TAG://标签的开始 if("persons".equals(parser.getName())){//获取当前标签的名称 infos = new ArrayList<PersonInfo>(); }else if("person".equals(parser.getName())){ info = new PersonInfo(); int id = Integer.parseInt(parser.getAttributeValue(0));//获取属性 info.id = id; }else if("name".equals(parser.getName())){ String name = parser.nextText();//获取下一个文本节点的值 info.name = name; }else if("age".equals(parser.getName())){ int age = Integer.parseInt(parser.nextText()); info.age = age; } break; case XmlPullParser.END_TAG://标签的结束 if("person".equals(parser.getName())){ infos.add(info); info = null; } break; default: break; } //继续往下解析 eventType = parser.next(); } //打印日志 for(PersonInfo personInfo:infos){ Log.i(TAG, personInfo.toString()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }(掌握)sharedpreference首选项
首选项
存储软件的配置信息:
window ini
android xml
1 自动登录
2 聊天 信息来了 。。。 很小
首选项不能存在太多的信息。 特点:当程序运行首选项里面的数据会全部加载进内容
存储的是私有的数据,并且数据形式是键值对。
(掌握)查看Settings的源码 获取sdcard的大小
Settings:设置应用
1 自动登录
2 聊天 信息来了 。。。 很小
首选项不能存在太多的信息。 特点:当程序运行首选项里面的数据会全部加载进内容
框架层
上层应用所有的源
查看源码:最好是把对应项目的代码导入到Eclipse
搜索 search File才可以
格式化 工具类
StatFs:对于硬盘空间的描述类
大家看源码。
通过search来找代码
(了解)sqlite数据库
嵌入式的数据库,体积小 功能强大
几十kb. 嵌入式设备上:计算器 手表
iso:Sqlite数据库
在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,但是主键只能是Integer类型的。
Sqlite数据库一般要求主键是_id,当然也可以是id.
原来:数据库
安装一个数据库的软件。
android里面的数据库是由底层的sqilte.c的代码来动态生成的。
(了解)sqlite3工具的使用
双加 --》next ....
不要对其进行升级处理。
用来查看数据库的客户端
(掌握)android数据库的创建
android系统封装了一个类SqliteOpenHelper
工具类:
获取数据库对象
/**
* 数据库的工具类
* 一般:用单例模式
* 把构造方法私有化 ,对外要提供一个方法 获取其他实例
* @author apple
*
*/
public class MySqliteOpenHelper extends SQLiteOpenHelper {
private static SQLiteOpenHelper mInstance;
/**
*
* @param context 上下文 打开或者创建数据库
* @param name 数据库的名字 要以.db结尾
* @param factory 游标工厂:创建游标对象
* @param version 数据库的版本号 如果版本号不同 执行onUpgrade()方法:数据库的升级
*/
private MySqliteOpenHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
//对外提供的方法
public static synchronized SQLiteOpenHelper getInstance(Context context){
if(mInstance == null){
mInstance = new MySqliteOpenHelper(context, "wuhan06.db", null, 1);
}
return mInstance;
}
/**
* 创建数据库里面的表 或者对表里面的数据执行初始化
* 创建一张表:person 字段:id(不标准) 最好是使用_id 唯一标示 主键 自增
* name
*/
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table person(_id integer primary key autoincrement,name text)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}增 删 查 改 实现
package cn.itcast.wh08.sqlite;
import cn.itcast.wh08.sqlite.db.MySqliteOpenHelper;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private SQLiteOpenHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取数据库的帮助类
helper = MySqliteOpenHelper.getIntance(this);
}
public void get(View v){
helper.getReadableDatabase();//问SQLiteOpenHelper要数据库 判断:数据库是否存在,如果存在就打开,否则创建
}
//插入
public void insert(View v){
//获取可写的数据库
SQLiteDatabase db = helper.getWritableDatabase();
//判断数据库是否打开
if(db.isOpen()){
//执行sql
db.execSQL("insert into persons(name) values('小鸡哥')");
//关闭数据库
db.close();
}
}
//查询
public void query(View v){
SQLiteDatabase db = helper.getReadableDatabase();
if(db.isOpen()){
//查询 获取游标(ResultSet是一样的只是名字不同)
Cursor cursor = db.rawQuery("select * from persons", null);
//迭代游标
while(cursor.moveToNext()){
//获取数据
// int _id = cursor.getInt(0);
//cursor.getColumnIndex("_id") 获取_id在cursor里面的下标
int _id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(1);
Log.i(TAG, "_id:"+_id+",name:"+name);
}
cursor.close();//关闭游标
db.close();
}
}
//更新
public void update(View v){
//获取可写的数据库
SQLiteDatabase db = helper.getWritableDatabase();
//判断数据库是否打开
if(db.isOpen()){
//执行sql
db.execSQL("update persons set name =? where _id = ?", new Object[]{"小覃",1});
//关闭数据库
db.close();
}
}
//删除
public void delete(View v){
//获取可写的数据库
SQLiteDatabase db = helper.getWritableDatabase();
//判断数据库是否打开
if(db.isOpen()){
//执行sql
db.execSQL("delete from persons where _id = ?", new Object[]{1});
//关闭数据库
db.close();
}
}
}
(掌握)利用sql语句对数据库增删改查
SQLite可以解析大部分标准SQL语句,如:
查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
如:select * from person
select * from person order by id desc
select name from person group by name having count(*)>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘传智’,3)
更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘传智‘ where _id=10
删除语句:delete from 表名 where 条件子句。如:delete from person where _id=10
相关文章推荐
- 【Android Studio快捷键】之代码提示
- Android31_BroadcastReceiver及Notification
- Android30_TAB书签导航条制作
- Android29_ViewPager
- Android Studio如何添加工程(project)为library(针对非gradle)
- Android28_Fragment及屏幕自适应
- Android27_LruCache缓存处理及异步加载图片类的封装
- 2015年,从毕业到工作的几点感悟(Android开发新人)
- 2015年,从毕业到工作的几点感悟(Android开发新人)
- Android中Java和JavaScript交互
- 阅读《Android 从入门到精通》(14)——时间选择器
- Android26_Bitmap二次采样
- Android25_Handler、Looper消息传递机制
- android应用程序窗口框架学习(4)-从setcontentview说起
- Android 三大图片缓存原理、特性对比
- Android Studio导入第三方jar包
- Android24_ActionBar及Dialog
- Android小记: Intent.setFlags(Intent.FLAG_ACTIVIT)使用
- android 类似qq左滑露出删除按钮
- ListView部分优化方法摘要