Android学习18--SQlite数据库

SQLite只是一个嵌入式的数据库引擎,专门适用于资源有限的设备上(如手机、PDA等)适量数据存取。SQLite只是一个文件。

1、简介SQLiteDatabase

Android提供了SQLiteDatabase代表一个数据库(底层就是一个数据库文件),一旦应用程序获得了代表指定数据库的SQLiteDatabase对象,接下来就可通过SQLiteDatabase对象来管理、操作数据库了。

SQLiteDatabase提供了如下静态方法打开一个文件对应的数据库:

a、static SQLiteDatabase openDatabase(String  path,SQLiteDatabase.CursorFactory  factory,int  flags):打开path文件代表的SQLite数据库。

b、static SQLiteDatabase  openOrCreateDatabase(File  file,SQLiteDatabaseCursorFactory  factory):打开或创建(如果不存在)file文件所代表的SQLite数据库。

c、static SQLiteDatabase  openOrCreateDatabase(String  path,SQLiteDatabaseCursorFactory  factory):打开或创建(如果不存在)path文件所代表的SQLite数据库。

在程序中获取SQLiteDatabase对象之后,接下来就可调用SQLiteDatabase的如下方法来操作数据库:

a、execSQL(String  sql,Object[ ]  bindArgs):执行带占位符的SQL语句。

b、execSQL(String sql):执行SQL语句。

c、insert(String table,String nullColumnHack,ContentValues  values):向执行表中插入数据。

d、update(String table ,ContentValues  values,String  whereClause,String[ ]  whereArgs):更新特定表中的特定数据

e、delete(String table,String whereClause,String[ ] whereArgs):删除指定表中的特定数据。

f、Cursor  query(String table,String[ ] columns,String selection,String[ ] selectionArgs,String groupBy,String having,String orderBy):对执行数据表执行查询。

g、Cursor  query(String table,String[ ] columns,String selection,String[ ] selectionArgs,String groupBy,String having,String orderBy,String limit):对执行数据表执行查询。limit参数控制最多查询几条记录(用于控制分页的参数)。

h、Cursor  query(boolean distinct,String table,String[ ] columns,String selection,String[ ] selectionArgs,String groupBy,String having,String orderBy,String limit):对指定表执行查询语句。其中第一个参数控制是否取出重复值。

i、rawQuery(String sql,String[ ] selectionArgs):执行带占位符的SQL查询。

j、beginTransaction():开始事物。

k、endTransaction():结束事物。

上面查询方法都是返回一个Cursor对象,Cursor提供了如下方法来移动查询结果的记录指针:

a、move(int  offset):将记录指针向上或向下移动指定的行数,offset为整数时向下移,为负数时向上移。

b、boolean  moveToFirst():将记录指针移动到第一行,如果移动成功则返回true。

c、boolean  moveToLast():将记录指针移动到最后一行,如果移动成功则返回true。

d、boolean  moveToNext():将记录指针移动到下一行,如果移动成功则返回true。

e、boolean  moveToPosition(int  position):将记录指针移动到指定的行,如果移动成功则返回true。

f、boolean  moveToPrevious():将记录指针移动到上一行,如果移动成功则返回true。

一旦将记录指针移动到指定行之后,接下来就可以调用Cursor的getXxx()方法获取改行指定列的数据。

2、创建数据库和类

使用SQLiteDatabase的静态方法可以打开或创建数据库,示例代码如下:

SQLiteDatabase.openOrCreateDatabase(“/mnt/db/temp.db3”,null);

//如果/mnt/db/目录下的temp.db3文件(该文件就是一个数据库)存在,那么程序就是打开数据库,如果该文件不存在,则代码将会在该目录下创建temp.db3文件(即对应于数据库)。第二个参数SQLIteDatabase.CursorFactory是一个用于返回Cursor的工厂,如果参数设为null,意味着使用默认的工厂。

上面的代码返回一个SQLiteDatabase对象,该对象的execSQL可执行任意的SQL语句,因此可通过如下代码创建数据表:

sql=“create table user_inf(user_id  integer  primary  key,user_name  varchar(255),user_pass  varchar(255))”;

db.execSQL(sql);

3、使用SQL语句操作SQLite数据库

SQLiteDatabase的execSQL方法可执行任意SQL语句,包括带占位符的SQL语句。但由于该方法没有返回值,一般用于执行DDL语句或DML语句:如果需要执行查询语句,可以调用SQLiteDatabase的rawQuery(String sql,String[ ]  selectionArgs)方法。示例代码如下:

db.execSQL(“insert  into  news_inf   values(null,?,?)“,new  String[ ] {title,content}) //执行插入语句

使用SQLiteDatabase进行数据库操作的步骤如下:

a、获取SQLiteDatabase对象,它代表了与数据库的连接。

b、调用SQLiteDatabase的方法来执行SQL语句。

c、操作SQL语句的执行结果,比如用SimpleCursorAdapter封装Cursor。

d、关闭SQLiteDatabase,回收资源。

SQLite有一个特点:它允许把各种类型的数据保存到任何类型字段中,开发者可以不用关心声明该字段所使用的数据类型。例如可以把字符串类型的值存入INTEGER类型字段中,也可以把数值类型的值存入布尔型的字段中。

                                    但有一个特殊情况:定义为INTEGER  PRIMARY  KEY的字段只能存储64位整数,当向这种字段保存除整数意外的其它类型的数据时,SQLite会产生错误。

由于SQLite允许存入数据时忽略底层数据列实际的数据类型,因此在编写建表语句时可省略数据列后面的类型声明,示例如下:

create  table  my_test ( _id  primary  key  autoincrement,name,pass,gender);

4、使用特定方法操作SQLite数据库

(1)使用insert方法插入记录

SQLiteDatabase的insert方法签名为long  insert(String table,String nullColumnHack,ContentValues  values),参数说明如下:

table:代表想插入数据的表名

nullColumnHack:代表强行插入null值的数据列的列名。

values:代表一行记录的数据。

insert方法插入的一行记录使用ContentValues存放,ContextValues类似于Map,它提供了put(String key,Xxx  value)(其中key为数据列的列名)方法用于存入数据,getAsXxx(String  key)用于取出数据。

示例代码如下:

ContextValues values=new  ContextValues();

values.put(”name“,”孙悟空“);

values.put(”age“,500);

long  rowid=db.insert(”person_inf“,null,values);

不管第三个参数是否包含数据,执行insert()方法总会添加一条记录,如果第三个参数为空,会添加一条除主键之外其它字段值都为null的记录。

一般来说,第二个参数指定的列名不应该是主键列的列名,也不应该是非空列的列名,否则强行往这些数据列插入null会引发异常。

其对应的SQL语句如下:

insert  into<表名>(key1,key2......)  values(value1,value2.......)

(2)使用update方法更新记录

SQLiteDatabase的update方法签名为update(String table ,ContentValues  values,String  whereClause,String[ ]  whereArgs),参数说明如下:

table:代表想更新数据的表名。

values:代表想更新的数据。

whereClause:满足该whereClause子句的记录将会被更新。

whereArgs:用于为whereClause子句传入参数。

该方法返回受此uodate语句影响的记录的条数。

例如我们想更新person_inf表中所有主键大于20的人的人名,代码如下:

ContextValues  values=new  ContextValues();

values.put(”name“,”新人名“);

int  result=db.update(”person_inf“,values,”_id>?“,,”new Integer[ ]{20}“);

对应的SQL语句如下:

update <table> set  key1=value1,key2=value2.....  where  <whereClause> 

(3)使用delete方法删除记录

SQLiteDatabase的delete方法签名为:delete(String table,String whereClause,String[ ] whereArgs),参数说明如下:

table:代表想删除数据的表名。

whereClause:满足该whereClause子句的记录将会被删除。

whereArgs:用于为whereClause子句传入参数

该方法返回受此delete语句影响的记录的条数。

例如我们想删除person_inf表中所有人名以孙开头的记录,代码如下:

int  result=db.delete(”person_inf“,”person_name like ?“,new  String[ ] {"孙_"});

对应的SQL语句如下:

delete <table> where  <whereClause>

(4)使用query方法查询记录

SQLiteDatabase的query方法的签名为Cursor  query(boolean distinct,String table,String[ ] columns,String selection,String[ ] selectionArgs,String groupBy,String having,String orderBy,String limit),参数说明如下:

distinct:指定是否去除重复记录。

table:执行查询数据的表名。

columns:要查询出来的列名,相当于select语句select关键字后面的部分。

selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句中允许使用占位符”?“。

selectionArgs:用于为selection子句中占位符传入参数值,值在数组中的位置与占位符在语句中的位置必须一致,否则会出现异常。

groupBy:用于控制分组。相当于select语句group by关键字后面的部分。

having:用于对分组进行过滤。相当于select语句having关键字后面的部分。

orderBy:用于对记录进行排序。相当于select语句order by关键字后面的部分,如personid desc,age  asc

limit:用于进行分页,相当于select语句limit关键字后面的部分,例如5,10

当应用程序需要进行”条件不确定“的查询(即查询条件需要动态改变的查询)时,使用这个query方法可以避免手动拼接SQL语句。

例如想查询出person_inf表中人名以”孙“开头的记录,代码如下:

Cursor  cursor=db.query(”person_inf“,new  String[ ] {”_id,name,age“},”name  like?“,new  String[ ]{"孙%"},null,null,”personid  desc“,”5,10“);

cursor.close();

5、事务

SQLiteDatabase中包含如下两个方法来控制事务:

beginTransaction():开始事务。

endTransaction():结束事务。

除此之外,SQLiteDatabase还提供了如下方法判断当前上下文是否处于事务环境中。

inTransaction():如果当前上下文处于事务中,返回true,否则返回false;

当程序执行endTransaction()方法时将会结束事务--到底是提交事务,还是回滚事务?取决于SQLiteDatabase是否调用了setTransactionSuccessful()方法来设置事务标志,如果程序事务执行中调用该方法设置了事务成功则提交事务,否则程序将回滚事务。示例代码:

db.beginTransaction();//开始事务

try{

//执行DML语句

......

db.setTransactionSuccessful();//调用该方法设置事务成功。否则endTransaction()方法将回滚事务

}

finally{

db.endTransaction();//由事务的标志决定是提交事务还是回滚事务

}

6、SQLiteOpenHelper类

SQLiteOpenHelper是Android提供的一个管理数据库的工具类,可用于管理数据库的创建和版本更新。一般的用法是创建SQLiteOpenHelper的子类,并扩展它的onCreate(SQLiteDatabase  db)和onUpgrade(SQLiteDatabase  db,int  oldVersion,int  newVersion)方法。

SQLiteOpenHelper包含如下常用的方法:

a、synchronized  SQLiteDatabase  getReadableDatabase():以读写的方式打开数据库对应的SQLiteDatabase对象。

b、synchronized  SQLiteDatabase  getWritableDatabase():以写的方式打开数据库对应的SQLiteDatabase对象。

c、abstract  void  onCreate(SQLiteDatabase  db):当第一次创建数据库时回调该方法。

d、abstract  void  onUpgrade(SQLiteDatabase  db,int  oldVersion,int  newVersion):当数据库版本更新时回调该方法。

e、synchronized  void  close():关闭所有打开的SQLiteDatabase。

一旦得到了SQLiteOpenHelper对象之后,程序无需使用SQLiteDatabase的静态方法创建SQLiteDatabase实例,而且可以用getWritableDatabase()或getReadableDatabase()方法来获取一个用于操作数据库的SQLiteDatabase实例。




### 回答1: Android中的SQLite数据库是一种轻量级的数据库,它可以在Android应用程序中存储和检索数据。SQLite数据库使用SQL语言来管理数据,可以在Android应用程序中创建、读取、更新和删除数据。使用SQLite数据库可以使应用程序更加高效和可靠,因为它可以在本地存储数据,而不需要访问网络。在Android中使用SQLite数据库需要使用SQLiteOpenHelper类来创建和管理数据库SQLiteOpenHelper类提供了一些方法来创建和升级数据库,以及插入、查询、更新和删除数据。在使用SQLite数据库时,需要注意数据类型、表结构、SQL语句等方面的问题,以确保数据的正确性和完整性。 ### 回答2: Android平台经常使用SQLite数据库来存储和管理本地数据。在本文中,我们将讨论如何在Android中使用SQLite数据库。 首先,在Android中使用SQLite数据库,我们需要创建一个SQLiteOpenHelper类。这个类用于创建和升级数据库。它包含了两个重要的方法:onCreate()和onUpgrade()。onCreate()方法将在首次创建数据库时被调用。onUpgrade()方法将在升级数据库时被调用。我们可以在这个类中定义表名,列名,数据库版本号和其他数据库相关信息。 接下来,在我们使用数据库前,需要实例化一个SQLiteOpenHelper类对象。这个对象用于打开或创建数据库。我们可以使用getReadableDatabase()和getWritableDatabase()方法来获取一个可读/写的数据库对象。 在获取数据库对象后,我们可以执行SQL命令来操作数据库。我们可以使用execSQL()方法来执行SQL命令。我们可以使用insert()、update()和delete()方法来执行增、删、改操作。我们可以使用rawQuery()方法来执行查询操作。 SQLiteOpenHelper类和SQLiteDatabase类并不是线程安全的。因此我们需要确保在使用时进行同步操作。我们可以使用synchronized关键字来达到同步效果。 在Android中,许多第三方的开源框架,如OrmLite、GreenDao和Realm等,提供了ORM(对象关系映射)的功能,使得数据库的操作更加简单和便捷。 总的来说,在Android中使用SQLite数据库可以轻松地存储和管理本地数据。SQLiteOpenHelper和SQLiteDatabase提供了丰富的API来操作数据库。ORM框架为我们提供了更加简便的数据库操作方式。因此,掌握AndroidSQLite数据库的使用非常重要。 ### 回答3: Android SQLite数据库Android开发中最常用的数据库之一,它是一个基于文件的嵌入式关系数据库管理系统。SQLite在设计时考虑到了资源占用和运行效率,所以非常适合在移动设备上使用。下面将详细介绍如何使用Android SQLite数据库。 1. 创建数据库 首先需要创建一个SQLite数据库,通过SQLiteOpenHelper类来创建,传入的参数主要是数据库版本号和数据库名称。在SQLiteOpenHelper的子类中重写onCreate方法来创建表格和一些初始化操作。 2. 执行SQL语句 在SQLiteOpenHelper的子类中重写onUpgrade方法来执行升级操作,可以通过执行ALTER TABLE语句来修改表格结构,并通过DROP TABLE语句删除表格。除此之外,在应用中也可以通过SQLiteDataBase对象的execSQL方法来执行SQL语句,如插入、删除或修改数据等。 3. 增删改查操作 增加(insert):通过SQLiteDataBase对象的insert方法来实现,在方法中传入表名和map对象,map对象中存储数据的键值对。 删除(delete):同样通过SQLiteDataBase对象的delete方法来实现,传入表名和删除条件。 修改(update):也是通过SQLiteDataBase对象的update方法来实现,同时传入修改的数据及条件。 查询(query):同样通过SQLiteDataBase对象的query方法来实现,传入要查询的表名、查询的列、查询条件等参数即可。 4. 事务操作 SQlite数据库支持事务操作,可以在一组操作中,只要有一个操作出现问题,就可以将之前的操作全部回滚,以保证数据的完整性和一致性。 以上就是android-sqlite数据库的使用方法,当然还有很多细节需要注意,例如:表格的设计、SQL语句的优化等。熟练掌握SQLite的使用,可以帮助开发者更好地管理应用数据,提高应用性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值