Android的数据存储方式

Android的数据存储方式,主要有五种:

一、Android本身的数据库:SQLite数据库,SQLite是一个轻量级的,跨平台的数据库。数据库中所有的信息都存储在单一文件内,占用内存小,并且支持基本SQL语法,是项目中经常被采用的一种数据存储方式,通常用于存储用户信息。

二、ShardPreferences,中文名应该可以翻译为:数据分区。这个本质是一个xml文件,以Map<Object,Object>形式存入手机内存中,常用于存储比较简单的参数设置,如QQ登录账号密码的存储,窗口功能状态的存储等,使用起来比较简单方便。

三、文件存储,数据以 I/O 流的形式把数据存入手机内存或者手机SD卡,可以存储大数据,如音乐,图片,视频等。

四、ContentProvider,内容提供者。是Android的四大组件之一,以数据库的形式存入手机,可以共享自己的数据给其他应用使用,相对于其他对外共享数据方式而言,ContentProvider统一了数据访问方式,使用起来更规范。

五、网络存储,把数据存储到服务器,不存储在本地,使用的时候直接从网络获取,避免了手机端信息丢失以及其他安全隐患。

 

SQLite数据库的使用很简单,首先需要创建一个类,继承SQLiteOpenHelper 类,并实现其onCreate() 和onUpgrade() 方法 ,代码如下

 

[java] view plain copy
 
  1. public class DBHelper extends SQLiteOpenHelper {  
  2.   
  3.     private static final String DBName = "MyDb";    //声明一个数据库名  
  4.     private static final int VERISON = 1;           //声明一个数据库版本号  
  5.   
  6.     public DBHelper(Context context) {  
  7.         super(context, DBName, null, VERISON);  
  8.     }  
  9.   
  10.     /* 
  11.     对数据库表进行初始化,只会在第一次创建数据库表时执行,并且只执行一次 
  12.      */  
  13.     @Override  
  14.     public void onCreate(SQLiteDatabase db) {  
  15.         String sql = "create table demo(id int,name varchar(20))";  //书写创建表的SQL语句  
  16.         db.execSQL(sql);          //执行SQL语句,创建表  
  17.   
  18.     }  
  19.   
  20.     /* 
  21.     这个方法是进行数据版本的更新 
  22.      */  
  23.     @Override  
  24.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  25.   
  26.     }  


然后我们创建一个数据库的操作类,其中要使用到SQLiteDatabase类,这个类有什么作用呢?

 

Android提供了一个名为 SQLiteDatabase的类(SQLiteOpenHelper 类中的 getWritableDatabase()getReadableDatabase()方法返回这个类的对象)。

  SQLiteDatabase类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。

  SQLiteDatabase的学习,应该重点掌握execSQL()和rawQuery()方法。

  execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句;

  rawQuery()方法用于执行select语句。

粗俗地讲就是可以通过这个类来进行增删改查!直接贴代码

 

[java] view plain copy
 
  1. public class DbManager {  
  2.     private DBHelper dbHelper;           //声明DBHelper类,需要通过这个类来获取SQLiterDatabase类的实例  
  3.     private SQLiteDatabase db;           //声明SQLiteDatabase类为全局变量,要只用这个类来进行增删改查  
  4.   
  5.     public DbManager(Context context){  
  6.         dbHelper = new DBHelper(context);        //初始化DBHelper类  
  7.         db = dbHelper.getWritableDatabase();     //获取SQLiterDatabase类的实例  
  8.     }  
  9.   
  10.     /* 
  11.     使用SQL语句插入 
  12.      */  
  13.     public void InsertDataforSQL(User user){  
  14.         boolean flag = false;  
  15.         //数据库操作有两种方式,一种是使用SQL语句,然后用execSQL(sql) 方法执行  
  16.         //为防止sql注入,我们使用占位符  
  17.         String insertSql = "insert into demo values(?,?)";  
  18.         db.execSQL(insertSql,new Object[]{user.getId(),user.getName()});  
  19.         //每次执行完记得关闭数据库  
  20.         db.close();  
  21.     }  
  22.   
  23.     /* 
  24.     使用SQLiteDatabase 中的方法 insert() 执行插入数据 
  25.      */  
  26.     public boolean InsertDataforcall(User user){  
  27.   
  28.         boolean flag = false;  
  29.         ContentValues cv = new ContentValues();  
  30.         cv.put("id",user.getId());  
  31.         cv.put("name",user.getName());  
  32.         long result = db.insert("demo",null,cv);  
  33.   
  34.         flag = result > 0 ? true : false;  
  35.         return flag;  
  36.     }  
  37.   
  38.   
  39.     /* 
  40.     删除数据 
  41.      */  
  42.     public boolean DelectData(User user){  
  43.         boolean flag = false;  
  44.         //直接调用SQLiterDatabase 中的delter() 方法,  
  45.         //参数1:要操作的表名  
  46.         //参数2:过滤条件  
  47.         //参数3:过滤的值  
  48.         int result = db.delete("demo","id=?",new String[]{String.valueOf(user.getId())});  
  49.         flag = result > 0 ? true : false;  
  50.         return flag;  
  51.     }  
  52.   
  53.     /* 
  54.     更新数据 
  55.      */  
  56.     public boolean UpdataData(User user){  
  57.         boolean flag = false;  
  58.         ContentValues cv = new ContentValues();  
  59.         cv.put("name",user.getName());  
  60.         //直接调用SQLiterDatabase update() 方法,  
  61.         //参数1:要操作的表名  
  62.         //参数2:更新的值,通过ContentValues  健值方式,将数据与数据库中字段绑定  
  63.         //参数3:过滤条件  
  64.         //参数4:过滤的值  
  65.         int result = db.update("demo",cv,"id=?",new String[]{String.valueOf(user.getId())});  
  66.         flag = result > 0 ? true : false;  
  67.         return flag;  
  68.   
  69.     }  
  70.   
  71.     /* 
  72.     查询返回一条数据 
  73.      */  
  74.     public User SelectOneUser(int id){  
  75.         User user = new User();  
  76.         Cursor cs = db.rawQuery("select * from demo ",null);  
  77.         while(cs.moveToNext()){  
  78.             user.setId(cs.getInt(cs.getColumnIndex("id")));  
  79.             user.setName(cs.getString(cs.getColumnIndex("name")));  
  80.         }  
  81.         return user;  
  82.     }  
  83.     /* 
  84.     查询返回多条数据 
  85.      */  
  86.     public List<User> SelectListUser(){  
  87.         List<User> list = new ArrayList<User>();  
  88.         //直接调用SQLiterDatabase 中的rawQuery() 方法,  
  89.         //参数1:数据库操作的sql 语句  
  90.         //参数2:过滤的值,可以为空  
  91.          
  92.         Cursor cs = db.rawQuery("select * from demo",null);  
  93.         while(cs.moveToNext()){  
  94.             User user = new User();  
  95.             user.setId(cs.getInt(cs.getColumnIndex("id")));  
  96.             user.setName(cs.getString(cs.getColumnIndex("name")));  
  97.             list.add(user);  
  98.         }  
  99.         cs.close();  
  100.         return list;  
  101.   
  102.     }  
  103.     //操作完数据库要将数据库关闭,防止内存泄漏  
  104.     public  void CloseDb(){  
  105.         db.close();  
  106.     }  


以上是对数据库的增删改查(对数据库的操作,也可以用泛型对其进行封装。),写好我们要测试,但Android的模拟器运行实在是太慢了,所以这里我们要使用到Android的单元测试。

使用Android studio 可以直接在

第二个包,con.example.lin.mycsdndome(androidTest) 中的类进行编写测试代码

比如

点击方法名,右键运行,然后看到这个界面

就说明测试通过,然后到控制到查看你的信息就可以了,如果是红色,说明有bug,就要进行分析啦!

posted @ 2018-04-03 19:14  心泪无恒  阅读(574)  评论(0编辑  收藏  举报