Android 常见数据存储方式有以下三种:1.使用SharedPreferences存储数据:其本质就是一个xml文件,可以保存字符串、布尔值、基础数据、集合等数据。常用于存储较简单的参数设置。
2.File文件存储数据:即常说的文件(I/O)存储方法,常用语存储大数量的数据。分为:Android系统自带的存储空间、外部储存设备(SDCard等)。
3.SQLite数据库存储数据:SQLite是一个轻量级的数据库,支持基本的SQL语法,是常被采用的一种数据存储方式。 Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的api。
SharedPreference,File,SQLiteDatabase这三种方式分别对应的目录为:
SharedPreference:/data/data/Package Name/shared_prefs
File手机存储:/data/data/Package Name/files
SDCard:/sdcard
SQLiteDatabase:/data/data/Package Name/database
可通过Android Studio右下角的“Device File Explorer”查看文件存储目录:
Device File Explorer
SharedPreferences存储数据// 1、获取SharedPreferences的实例
// name 会帮助我们生成一个xml文件
SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
// 2、获取sp的编辑器
SharedPreferences.Editor edit = sp.edit();
edit.putString("name", "wangfang");// 第一个参数是key,第二个参数是value
edit.putString("pwd", "111111");
// 3、提交edit保存数据
edit.commit();
// 在config.xml中获取存储的数据
String name = sp.getString("name", "");// 第一个参数是key,如果找不到这个值第二个参数是默认值" +
String pwd = sp.getString("pwd", "");
System.out.println("name="+name+" "+"pwd="+pwd);
File文件存储数据
1.将数据存储在手机存储中:public static boolean saveInfo(Context context, String text) {
try {
// 获取文件保存的路径
String path = context.getFilesDir().getPath();
// 通过上下文获取FileOutputStream 此行代码相当于上面的三行代码
FileOutputStream fos = context.openFileOutput("userinfo.txt", 0);
fos.write(text.getBytes());
fos.close();
return true;
}catch (Exception e) {
e.printStackTrace();
return false;
}
}public static String readInfo(Context context) {
try {
FileInputStream fis = context.openFileInput("userinfo.txt");
BufferedReader bufr =new BufferedReader(new InputStreamReader(fis));
String content = bufr.readLine();// 读取数据
fis.close();
return content;
}catch (Exception e) {
e.printStackTrace();
return null;
}
}
2.将数据存储在SDCard中:public static boolean saveInfoToCard(String text) {
// 保存之前,先判断sdcard是否可用
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
// sdcard可用
try {
// 获取文件保存的sdcard路径
String sdPath = Environment.getExternalStorageDirectory().getPath();
FileOutputStream fos =new FileOutputStream(file);
fos.write(text.getBytes());
fos.close();
return true;
}catch (Exception e) {
e.printStackTrace();
return false;
}
}else {
// sdcard不可用
return false;
}
}public static String readInfoFromCard() {
try {
String sdPath = Environment.getExternalStorageDirectory().getPath();
File file =new File(sdPath, "info.txt");
FileInputStream fis =new FileInputStream(file);
BufferedReader bufr =new BufferedReader(new InputStreamReader(fis));
String content = bufr.readLine();// 读取数据
return content;
}catch (Exception e) {
e.printStackTrace();
return null;
}
}
SQLite数据库存储数据
第一步:定义一个类继承SqliteOpenHelperpublic class MyOpenHelpextends SQLiteOpenHelper {
// 数据库版本号
private static IntegerVersion =1;
public MyOpenHelp(Context context) {
// 第一个参数:上下文
// 第二个参数:数据库名称
// 第三个参数:游标位置
// 第四个参数version:数据库版本号,默认从 1 开始
super(context, "data.db", null, Version);
}
// 数据库第一次创建的时候调用
// 用来表结构的初始化(用sql创建表)
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
// id 一般以_id
sqLiteDatabase.execSQL("create table info (id integer primary key autoincrement, name varchar(20), phone varchar(20))");
}
// 当数据库版本需要升级的时候调用(数据库版本增大时,才会调用)不能把高版本降级到低版本
// 更新表结构
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
// 给info表添加phone字段
sqLiteDatabase.execSQL("alter table info add sex varchar(20)");
}
第二步:使用SqliteDatabase类操作数据库
private MyOpenHelp myOpenHelp = new MyOpenHelp(getApplicationContext());
1.使用sql语句对数据库进行增删改查
// 增加数据public void button1(View view) {
// 获取数据库对象
SQLiteDatabase db =myOpenHelp.getWritableDatabase();
// 执行sql语句
db.execSQL("insert into info (name, phone) values(?, ?)", new Object[]{"王方", "123456789"});
// 关闭数据库
db.close();
}
// 删除数据库数据public void button2(View view) {
// 获取数据库对象
SQLiteDatabase db =myOpenHelp.getWritableDatabase();
// 执行sql语句
db.execSQL("delete from info where name=?", new Object[]{"王方"});
// 关闭数据库
db.close();
}
// 更新数据public void button3(View view) {
// 获取数据库对象
SQLiteDatabase db =myOpenHelp.getWritableDatabase();
// 执行sql语句
db.execSQL("update info set phone=? where name=?", new Object[]{"88888888", "王方"});
// 关闭数据库
db.close();
}
// 查询数组public void button4(View view) {
// 获取数据库对象
SQLiteDatabase db =myOpenHelp.getWritableDatabase();
// 执行sql语句
Cursor cursor = db.rawQuery("select * from info", null);
cursor.moveToFirst();
StringBuffer stringBuffer =new StringBuffer();
while (!cursor.isAfterLast()) {
// 获取 name 值
Integer id = cursor.getInt(0);
String name = cursor.getString(1);
String phone = cursor.getString(2);
System.out.println("name="+name +"phone="+phone);
stringBuffer.append("id="+id+"name="+name +"phone="+phone);
cursor.moveTonext();
}
tv.setText(stringBuffer);
// 关闭Cursor
cursor.close();
// 关闭数据库
db.close();
}
优点:多表查询容易
缺点:sql语句容易写错
执行sql语句没有返回值,不能根据结果是否成功给用户弹框提示是否成功
2.使用谷歌封装好的api对数据库增删改查
// 增加数据public void button1(View view) {
// 获取数据库对象
SQLiteDatabase db =myOpenHelp.getWritableDatabase();
// 使用谷歌封装好的API
ContentValues contentValues =new ContentValues();
contentValues.put("name", "Json");
contentValues.put("phone", "123456789");
// 返回值代表插入新行的id
long result = db.insert("info", null, contentValues);
// 关闭数据库
db.close();
if (result >0) {
Toast.makeText(this, "添加成功", Toast.LENGTH_LONG).show();
}else {
Toast.makeText(this, "添加失败", Toast.LENGTH_LONG).show();
}
}
// 删除数据库数据public void button2(View view) {
// 获取数据库对象
SQLiteDatabase db =myOpenHelp.getWritableDatabase();
// 返回值代表影响的行数
int result = db.delete("info", "name=?", new String[]{"Json"});
// 关闭数据库
db.close();
Toast.makeText(this, "删除了"+result+"行数据", Toast.LENGTH_LONG).show();
}
// 更新数据public void button3(View view) {
// 获取数据库对象
SQLiteDatabase db =myOpenHelp.getWritableDatabase();
ContentValues contentValues =new ContentValues();
contentValues.put("phone", "88888888");
// 返回值代表更新了多少行
long result = db.update("info", contentValues, "name=?", new String[]{"Json"});
// 关闭数据库
db.close();
Toast.makeText(this, "更新了"+result+"行数据", Toast.LENGTH_LONG).show();
}
// 查询数组public void button4(View view) {
// 获取数据库对象
SQLiteDatabase db =myOpenHelp.getWritableDatabase();
// 执行sql语句
// Cursor cursor = db.rawQuery("select * from info", null);
Cursor cursor = db.query("info", null, null, null, null, null, null);
cursor.moveToFirst();
StringBuffer stringBuffer =new StringBuffer();
while (!cursor.isAfterLast()) {
// 获取 name 值
Integer id = cursor.getInt(0);
String name = cursor.getString(1);
String phone = cursor.getString(2);
System.out.println("id="+id+"name="+name +"phone="+phone);
stringBuffer.append("id="+id+"name="+name +"phone="+phone);
cursor.moveTonext();
}
tv.setText(stringBuffer);
// 关闭Cursor
cursor.close();
// 关闭数据库
db.close();
}
优点:不用写复杂的sql语句,写法简单
有返回值,方便判断结果