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,就要进行分析啦!

  • 相关阅读:
    《设计原本》读书笔记01
    SQL SERVER存储过程的几种示例
    SQLSERVER2008 存储过程基本语法
    (转)C#程序开发中经常遇到的10条实用的代码
    (转)C#正则表达式Regex类的用法
    常用正则表达式
    (转)通过WMI获取网卡MAC地址、硬盘序列号、主板序列号、CPU ID、BIOS序列号
    checkbox:全选与反全选
    checkbox:获取所有已选中的值
    Quartz(任务调度)- Cron
  • 原文地址:https://www.cnblogs.com/edensyd/p/8710499.html
Copyright © 2011-2022 走看看