第八章 数据存储
数据存储方式
Internal Storage 内部存储
External Storage 外部存储
SQLite DataBase 数据库存储
Http 网络存储
Shared Prefrences 参数共享
存储位置:data/data/包名/shared_prefs/MainAcitivy.xml
格式:xml
保存数据:
//获取Shared Prefrences类型对象
SharedPrefrences sp = getSharedPrefrences("xxx",0);
或者
SharedPrefrences sp = getPrefrences(0);
//获取Edit类型的对象
Edit edit = sp.edit();
//写入数据
edit.putString("name","小明");
edit.putBoolean("isTrue","true");
//提交数据(必须要有)
edit.commit();
提取数据
//获取SharedPrefrences类型对象
SharedPrefrences sp = getSharedPrefrences("xxx",0);
或者
SharedPrefrences sp = getPrefrences(0);
//根据存入的key值取出相应的数据
String name = sp.getString("name",小红);
boolean b = sp.getBoolean("isTrue",false);
Internal Storage 内部存储
存储位置:data/data/包名/files/xxx.xxx
格式:自定义
保存数据:
FileOutputStream fos = openFileOutput("aaa",0);
String str = "数据存储";
fos.write(str.getBytes());
读取数据
FileInputStream fis = openFileInput("aaa");
ByteArrayBuffer arrayBuffer = new ByteArrayBuffer(100);
byte[] b = new byte[1024];
int len = 0;
while(-1!=(len=fis.read(b))){
arrayBuffer.append(b,0,len);
}
String str = new String(arrayBuffer.toByteArray());
External Storage 外部存储
存储位置:mnt/sdcard
读取权限:
(1)sdcard路径:
Environment.getExternalStorageDirectory().getAbsolutePath();
(2)判断sdcard是否可用:
Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
SQLite DataBase 数据库存储
Android平台集成小型数据库SQLite
特点:跨平台、免费、轻量级、多线程
SQL语句:
与表相关:
a. 建表:CREATE TABLE 表名 (id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20),phone VARCHAR(20))
b. 删表:DROP TABLE 表名
c. 改表:ALERT TABLE 表名 ADD age INTEGER
与数据相关:增、删、改、查
a. 增加数据:INSERT INTO 表名 (字段名) VALUES (值)
b. 删除数据:DELETE FROM 表名 WHERE 条件
c. 修改数据:UPDATE 表名 SET 字段名=值 WHERE 条件
d. 查询数据:SELECT * FROM 表名 WHERE 条件 GROUP BY 分组 ORDER BY 排序
创建SQLite数据库的步骤:
a. 创建一个辅助类继承SQLiteOpenHelper
b. 在辅助类的onCreate()方法中,添加创建表的语句,执行该语句
String str = "CREATE TABLE student (id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20),age INTEGER, phone VARCHAR(20))";
db.execSQL(str);
c. 在Activity中,先创建辅助类对象,再用辅助类对象调用getReadableDatabase()或者getWriteableDataBase()创建数据库对象
备注:当数据库和表都已经存在时,onCreate()方法不会再调用
当version发生变化时,会调用onUpgrade()方法
SQL语句实例:
(1)增
String str = "INSERT INTO student (name,phone) VALUES (?,?)";
mDB.execSQL(str,new String[]{"小明","1111"});
(2)删
String str = "DELETE FROM student WHERE name = ?";
mDB.execSQL(str,new String[]{"小明"});
(3)改
String str = "UPDATE student SET name = ?,phone = ? WHERE id = ?";
mDB.execSQL(str,new String[]{"小红","2222","1"});
(4)查
String str = "SELECT * FROM student";
Cursor cursor = mDB.rawQuery(str,null);
while(cursor.moveToNext()){
//获取各字段值的索引
int idIndex = cursor.getColumnIndex("id");
int nameIndex = cursor.getColumnIndex("name");
int phoneIndex = cursor.getColumnIndex("phone");
//根据索引取出数据
String id = cursor.getString(idIndex);
String name = cursor.getString(nameIndex);
String phone = cursor.getString(phoneIndex);
}
ORM 对象关系映射
(1)增
ContentValues values = new ContentsValues();
values.put("name","小白");
values.put("phone","12356");
mDB.insert("student", //表名
null;//规避插入错误
values);//插入的值
(2)删
mDB.delete("student",//表名
"name=?",条件语句
new String[]{"小白"});占位符的填充
(3)改
ContentValues values = new ContentValues();
values.put("phone","45621");
mDB.update("student",//表名
values,//将要修改的值
"name=?",条件语句
new String[]{"小白"});//占位符填充
(4)查
Cursor cursor = mDB.query("student",//表名
null,//查询的字段
null,//查询条件
null,//条件语句占位符的填充
null,//分组语句
null,//分组语句占位符的填充
null);//排序语句
while(cursor.moveToNext()){
//获取字段索引
int nameIndex = cursor.getColumnIndex("name");
//根据索引取出数据
String name = cursor.getString(nameIndex);
}
CursorAdapter游标适配器
注意:必须含有_id
// 将布局xml文件转换成布局对象
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View inflate = getLayoutInflater().inflate(R.layout.list_item, null);
return inflate;
}
// 设置数据显示
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView textView1 = (TextView) view.findViewById(R.id.textView1);
TextView textView2 = (TextView) view.findViewById(R.id.textView2);
// 获取数据
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
// 设置属性值
textView1.setText(name);
textView2.setText(phone);
}
更新数据
// 重新查询,得到一个新的cursor对象
Cursor cursor = mDB.query("student", null, null, null, null, null, null);
// 将最新的cursor对象设置到适配器中
mAdapter.changeCursor(cursor);
// 刷新显示
mAdapter.notifyDataSetChanged();