文章      动态     相关文章     最新文章     手机版动态     相关动态     |   首页|会员中心|保存桌面|手机浏览

yuchen6

http://www78564.xrbh.cn/comyuchen6/

相关列表
文章列表
推荐文章
Android 常见数据存储方式手机存储「Android 常见数据存储方式」
发布时间:2025-01-11        浏览次数:0        返回列表

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

// 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数据库存储数据

第一步:定义一个类继承SqliteOpenHelper

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

有返回值,方便判断结果

缺点: