android常用的存储方式,Android 常见数据存储方式

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”查看文件存储目录:

0609287543ef

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+"\n"+"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;

/**

* 构造函数

* 在SQLiteOpenHelper的子类中,必须有该构造函数

*/

public MyOpenHelp(Context context) {

// 第一个参数:上下文

// 第二个参数:数据库名称

// 第三个参数:游标位置

// 第四个参数version:数据库版本号,默认从 1 开始

super(context, "data.db", null, Version);

}

// 数据库第一次创建的时候调用

// 用来表结构的初始化(用sql创建表)

/**

* 复写onCreate()

* 调用时刻:当数据库第1次创建时调用

* 作用:创建数据库 表 & 初始化数据

* SQLite数据库创建支持的数据类型: 整型数据、字符串类型、日期类型、二进制

*/

@Override

public void onCreate(SQLiteDatabase sqLiteDatabase) {

// id 一般以_id

sqLiteDatabase.execSQL("create table info (id integer primary key autoincrement, name varchar(20), phone varchar(20))");

}

// 当数据库版本需要升级的时候调用(数据库版本增大时,才会调用)不能把高版本降级到低版本

// 更新表结构

/**

* 复写onUpgrade()

* 调用时刻:当数据库升级时则自动调用(即 数据库版本 发生变化时)

* 作用:更新数据库表结构

* 注:创建SQLiteOpenHelper子类对象时,必须传入一个version参数,该参数 = 当前数据库版本, 若该版本高于之前版本, 就调用onUpgrade()

*/

@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语句,写法简单

有返回值,方便判断结果

缺点:如果有多张表,多表查询不容易查询

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值