Android的四种数据存储方式:
1.SharedPreferences
2.SQLite
3.Content Provider
3.文件存储
一:SharedPreferences存储
1.SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。
2.实现SharedPreferences存储的步骤如下:
(1)获取SharedPreferences对象
(2)获得SharedPreferences.Editor对象
(3)通过Editor接口的putXxx方法保存key-value对,其中Xxx表示不同数据类型
(4)通过Editor接口的commit方法保存key-value对
pref=getSharedPreferences("Userinfo", MODE_PRIVATE);
editor=pref.edit();
//获得保存的名字
String name=pref.getString("userName", "");
if (name==null) {
//如果当前值为空
chk.setChecked(false);
}
else {
//如果当前值不为空,则给赋值
chk.setChecked(true);
etuserName.setText(name);
}
public void doClick(View v) {
switch (v.getId()) {
case R.id.btn_login:
String name=etuserName.getText().toString().trim();//去掉首位符号
String pass=etuserPassword.getText().toString().trim();//去掉首位符号
if ("admin".equals(name)&&"123456".equals(pass)) {
if (chk.isChecked()) {
editor.putString("userName", name);
editor.commit();
}
else {
editor.remove("userName");
editor.commit();
}
Toast.makeText(MainActivity.this, "登陆成功", Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(MainActivity.this, "禁止登陆",Toast.LENGTH_LONG ).show();
}
break;
case R.id.btn_cancel:
break;
default:
break;
}
}
二.SQLite
SQLite常用语句:
db.exectSQL(sql) //执行任何SQL语句
db.insert(table,nullColumnHack,values) //插入
db.delete(table,whereClause,whereArgs) //删除
db.update(table,values,whereCaluse,whereArgs) //更新
db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy) //查找
db.rawQuery(sql,selectionArgs) //查找
1.Cursor是Android查询数据后得到的一个管理数据集合的类,正常情况下,如果查询得到的数据量较小时不会有内存问题,而且虚拟机能够保证Cusor最终会被释放掉。
2.然而如果Cusor的数据量特别大,特别是如果里面有Blob信息时,应该保证Cusor占用的内存被及时的释放掉,而不是等待GC来处理。
//每个程序都有自己的数据库,默认情况下互不干扰
//创建一个数据库 并且打开
SQLiteDatabase db=openOrCreateDatabase("user.db", MODE_PRIVATE, null);
db.execSQL("create table if not exists usertb(_id integer primary key autoincrement,name text not null,age integer not null,sex text not null)");
db.execSQL("insert into usertb(name,age,sex)values('张三',18,'女')");
db.execSQL("insert into usertb(name,age,sex)values('李四',19,'女')");
db.execSQL("insert into usertb(name,age,sex)values('王五',20,'男')");
Cursor c=db.rawQuery("select * from usertb", null);
if(c!=null)
{
while(c.moveToNext())
{
Log.i("info", "_id:"+c.getInt(c.getColumnIndex("_id")));
Log.i("info", "name:"+c.getString(c.getColumnIndex("name")));
Log.i("info", "age:"+c.getInt(c.getColumnIndex("age")));
Log.i("info", "sex:"+c.getString(c.getColumnIndex("age")));
Log.i("info", "!!!!!!!!!!!!!!!!!!!!!!");
}
c.close();
}
db.close();
SQLite:不直接使用sql语句,调用函数来操作
SQLiteDatabase db=openOrCreateDatabase("stu.db", MODE_PRIVATE, null);
db.execSQL("create table if not exists stutb(_id integer primary key autoincrement,name text not null,age integer not null,sex text not null)");
ContentValues values=new ContentValues();
values.put("name", "张三");
values.put("age", 19);
values.put("sex", "男");
//插入数据
db.insert("stutb", null, values);
values.clear();
values.put("name", "张三峰");
values.put("age", 36);
values.put("sex", "男");
//插入数据
db.insert("stutb", null, values);
values.clear();
values.put("name", "张三枫");
values.put("age", 45);
values.put("sex", "男");
//插入数据
db.insert("stutb", null, values);
values.clear();
values.put("sex", "女");
//将id>3的人性别全部改成女
db.update("stutb", values, "_id>?", new String[]{"3"});
//将名字中带有峰子的人删除
db.delete("stutb", "name like?", new String[]{"%峰%"});
//查询所有人员
Cursor c=db.query("stutb", null, "_id>?", new String[]{"0"}, null, null, "age");
if(c!=null)
{
String[] columns=c.getColumnNames();
while(c.moveToNext())
{
for(String columnName:columns)
{
Log.i("info", columnName+":"+c.getString(c.getColumnIndex(columnName)));
}
}
c.close();
}
db.close();
运行结果:
结果分析:因为插入了两遍,所以总共有六条数据,首先将id>3的人性别都改为了女,然后删除了名字中有“峰”的人,然后将查询结果返回给Cusor ,返回结果按id排序的,所以最终打印结果如上所示。
三:FILE文件存储
/******************************************************************/
如何将内容写入文件并从文件中读取数据
/******************************************************************/
//保存文件
public void WriteFile(String content)
{
FileOutputStream fos;
try {
fos = openFileOutput("a.text", MODE_PRIVATE);
fos.write(content.getBytes());
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//读取文件
public String readFile()
{
String content=null;
FileInputStream fis;
try {
fis = openFileInput("a.text");
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len=0;
while((len=fis.read(buffer))!=-1)
{
baos.write(buffer, 0, len);
}
content=baos.toString();
fis.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return content;
}
edt=(EditText) findViewById(R.id.edt);
btn_write=(Button) findViewById(R.id.btn_write);
tv=(TextView) findViewById(R.id.contentVaule);
btn_write.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
WriteFile(edt.getText().toString());
tv.setText(readFile());
}
});