Android数据存储之SQLite

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,占用资源非常少,只有几百KB内存。支持Windows/Linux/Unix等等主流的操作系统,同时能够跟其他程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite是当前使用最广泛的数据库,基于以上优点,Android系统采用SQLite数据库。

SQLiteOpenHelper介绍

 Android应用程序为了对数据库进行管理,提供了一个抽象类SQLiteOpenHelper,SQLiteOpenHelper类提供了两个重要的方法,分别是 onCreate()和 onUpgrade(),onCreate用于初次使用软件时生成数据库表,onUpgrade用于升级软件时更新数据库表结构。

  当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法。onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。

onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的。

  假设现在的版本是1,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2,并且在onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后做出相应的表结构及数据更新。

Demo的实现

先来看一个页面:

布局就不用写了,就是四个按钮,实现的目的就是在生成Person数据库,同时生成一个表,然后操作Person中的数据:

首先需要重写一下抽象类SQLiteOpenHelper中的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public  class  MySQLDBHelper  extends  SQLiteOpenHelper {
 
     private  static  final  String DBname= "Person.db" ;
     private  static   final  int  version= 1 ;
     private  String tag= "MySQLDBHelper" ;
 
     public  MySQLDBHelper(Context context) {
         super (context, DBname,  null , version);
         Log.i(tag,  "测试" );
     }
     
     @Override
     public  void  onCreate(SQLiteDatabase db) {
         // TODO Auto-generated method stub
         Log.i(tag,  "Person数据库中Person创建前" );
         String sqlString= "create table Person (id integer primary key autoincrement,Name nvarchar(200),Address nvarchar(200))" ;
         db.execSQL(sqlString);
         Log.i(tag,  "Person数据库中Person创建成功" );
     }
 
     @Override
     public  void  onUpgrade(SQLiteDatabase db,  int  oldVersion,  int  newVersion) {
         // TODO Auto-generated method stub
         Log.i(tag,  "更新数据库,暂时不需要使用" );
     }
 
}

构造函数中的数据库名称和版本号都是自己可以固定一下,测试就没有传那么多参数,,多说一下这个@Override:

@Override是伪代码,表示重写(当然不写也可以),不过写上有两点好处: 
1、可以当注释用,方便阅读;
2、编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。例如,你如果没写@Override,而你下面的方法名写错了,这时你的编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法。

插入数据调用,这里获取SQLiteDatabase,让后把拼接好的sql直接传入执行就OK了:

1
2
3
4
5
6
public  void  insert(View view) {
         SQLiteDatabase database = dbhelper.getWritableDatabase();
         String sql =  "insert into Person values(NULL,?,?)" ;
         database.execSQL(sql,  new  Object[] {  "FlyElephant" "北京"  });
         Log.i(tag,  "插入成功" );
     }

更新数据,这里注意一下ContentValues的使用,键值对的顺序:

1
2
3
4
5
6
7
8
public  void  update(View view) {
     SQLiteDatabase database = dbhelper.getWritableDatabase();
     ContentValues contentValues =  new  ContentValues();
     contentValues.put( "Address" "深圳" );
     database.update( "Person" , contentValues,  "Name=?" ,
             new  String[] {  "FlyElephant"  });
     Log.i(tag,  "更新成功" );
}

查询数据,这里用到了游标,类似于C#中SqlDataReader的使用,moveToNext可以满足基本需求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public  void  query(View view) {
     SQLiteDatabase database = dbhelper.getReadableDatabase();
     Cursor cursor = database.rawQuery( "select * from Person" null );
     if  (cursor.getCount()> 0 ) {
         while  (cursor.moveToNext()) {
             String nameString = cursor.getString(cursor.getColumnIndex( "Name" ));
             String addreString = cursor.getString(cursor
                     .getColumnIndex( "Address" ));
             Log.i(tag,  "Name:"  + nameString +  "--Address:"  + addreString);
         }
     } else  {
         Log.i(tag,  "没有数据" );
     }
     cursor.close();
}

如果你觉得moveToNext()不能满足需求,我就从网上找了一下别人贴的代码,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
c.move( int  offset);  //以当前位置为参考,移动到指定行
c.moveToFirst();     //移动到第一行
c.moveToLast();      //移动到最后一行
c.moveToPosition( int  position);  //移动到指定行
c.moveToPrevious();  //移动到前一行
c.moveToNext();      //移动到下一行
c.isFirst();         //是否指向第一条
c.isLast();      //是否指向最后一条
c.isBeforeFirst();   //是否指向第一条之前
c.isAfterLast();     //是否指向最后一条之后
c.isNull( int  columnIndex);   //指定列是否为空(列基数为0)
c.isClosed();        //游标是否已关闭
c.getCount();        //总数据项数
c.getPosition();     //返回当前游标所指向的行数
c.getColumnIndex(String columnName); //返回某列名对应的列索引值
c.getString( int  columnIndex);    //返回当前行指定列的值

删除数据:

1
2
3
4
5
public  void  delete(View v) {
     SQLiteDatabase database = dbhelper.getReadableDatabase();
     database.delete( "Person" "Name=?" new  String[] {  "FlyElephant"  });
     Log.i(tag,  "删除成功" );
}

 可以看下结果:

 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4052488.html,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
存储 安全 Android开发
Android数据存储:请解释ContentProvider是什么,它的主要作用是什么?
Android数据存储:请解释ContentProvider是什么,它的主要作用是什么?
25 0
|
3月前
|
存储 Java 数据库
Android数据存储:什么是Room Persistence Library?
Android数据存储:什么是Room Persistence Library?
41 0
|
3月前
|
存储 数据库连接 数据库
Android数据存储:解释SQLite数据库在Android中的使用。
Android数据存储:解释SQLite数据库在Android中的使用。
40 0
|
4月前
|
存储 XML Android开发
Android Studio App开发入门之数据存储中共享参数SharedPreferneces的讲解及使用(附源码 超详细必看)
Android Studio App开发入门之数据存储中共享参数SharedPreferneces的讲解及使用(附源码 超详细必看)
29 0
|
2月前
|
存储 监控 安全
内网屏幕监控软件的数据存储与管理:使用SQLite数据库保存监控记录和配置信息
在当今数字化时代,安全和监控在企业和组织中变得至关重要。内网屏幕监控软件作为一种关键工具,帮助组织监视员工的活动并确保信息安全。这种软件不仅需要高效地记录和管理监控数据,还需要能够方便地进行配置和调整。本文将讨论如何使用SQLite数据库来保存监控记录和配置信息,并介绍如何通过自动化机制将监控到的数据提交到指定网站。
145 2
|
3月前
|
存储 XML 文件存储
Android数据存储:什么是SharedPreferences?它有什么用途?
Android数据存储:什么是SharedPreferences?它有什么用途?
73 0
|
4月前
|
存储 数据库 文件存储
android开发,使用kotlin学习数据存储
android开发,使用kotlin学习数据存储
55 0
|
4月前
|
XML 数据库 数据安全/隐私保护
Android App规范处理中版本设置、发布模式、给数据集SQLite加密的讲解及使用(附源码 超详细必看)
Android App规范处理中版本设置、发布模式、给数据集SQLite加密的讲解及使用(附源码 超详细必看)
40 0
|
4月前
|
SQL 数据库 数据安全/隐私保护
Android Studio App开发中数据库SQLite的解析及实战使用(包括创建数据库,增删改查,记住密码等 附源码必看)
Android Studio App开发中数据库SQLite的解析及实战使用(包括创建数据库,增删改查,记住密码等 附源码必看)
58 0
|
5月前
|
Shell 数据库 开发工具
(超详细)android中SqLite数据库的使用(一文包懂包会)
(超详细)android中SqLite数据库的使用(一文包懂包会)
99 0