zoukankan      html  css  js  c++  java
  • 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,就要进行分析啦!

  • 相关阅读:
    新浪微盘又是一个给力的产品啊,
    InfoQ: 百度数据库架构演变与设计
    列式数据库——Sybase IQ
    MapR初体验 淘宝共享数据平台 tbdata.org
    IBM正式发布新一代zEnterprise大型机(组图) 大型机,IBM,BladeCenter,美国,纽约 TechWeb News
    1TB is equal to the number of how many GB? 1PB equal to is equal to the number of TB? 1EB PB? | PCfault.com
    Cassandra vs HBase | WhyNosql
    The Hadoop Community Effect
    雅虎剥离开源软件平台 Hadoop ,与风投新建 Hortonworks 公司 品味雅虎
    RowOriented Database 、ColumnOriented Database 、KeyValue Store Database 、DocumentOriented Database
  • 原文地址:https://www.cnblogs.com/edensyd/p/8710499.html
Copyright © 2011-2022 走看看