使用SQLite方式存储数据

声明:本文参考N篇文章所该,并加上自己的理解。由于参考博文很多,所以可能某些地方忘记注明转载出处,还望原作者见谅。


1.SQL基本命令     **(重点)  

转自:http://www.cnblogs.com/menlsh/archive/2013/04/13/3019588.html

  SQL是与关系型数据库通信的唯一方式。它专注于信息处理,是为构建、读取、写入、排序、过滤、映射、分组、聚集和通常的管理信息而设计的声明式语言。

  在讲解SQL基本命令之前,有必要先了解一下SQLite所支持的数据类型都有哪些。

1.1 SQLite支持的数据类型

  SQLite采用动态数据存储类型,会根据存入的值自动进行判断。SQLite支持以下5种数据类型:

  (1)NULL:空值

  (2)INTEGER:带符号的整型

  (3)REAL:浮点型

  (4)TEXT:字符串文本

  (5)BLOB:二进制对象

      也支持以下类型:

smallint  16 位元的整数
interger  32 位元的整数
decimal(p,s)  p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值 ,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float   32位元的实数。
double   64位元的实数。
char(n)   n 长度固定的字串,n不能超过 254。
varchar(n)  长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n)  和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。 这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n)  可变长度且其最大长度为 n 的双字元字串,n不能超过 2000。
date   包含了 年份、月份、日期。
time   包含了 小时、分钟、秒。
timestamp  包含了 年、月、日、时、分、秒、千分之一秒。


1.2 SQL基本命令

  表是探索SQLite中SQL的起点,也是关系型数据库中信息的标准单位,所有的操作都是以表为中心的。那么如何使用SQL命令创建一张表呢?

1.2.1创建表

  表是由行和列组成的,列称为字段,行称为记录。

  使用CREATE命令可以创建表,CREATE命令的一般格式为:

  CREATE [TEMP/TEMPORARY] TABLE table_name (column_definitions [, constraints(约束的意思)]);

  其中,[]中的内容是可选的,用TEMP或TEMPORARY关键字声明的表是临时表,这种表只存活于当前会话,一旦连接断开,就会被自动销毁。如果没有明确指出创建的表是临时表,则创建的是基本表,将会在数据库中持久存在,这也是数据库中最常见的表。

  CREATE TABLE命令至少需要一个表名和一个字段名,上述命令中的table_name表示表名,表名必须与其他标识符不同。column_definitions由用逗号分隔的字段列表组成,每个字段定义包括一个名称、一个域(类型)和一个逗号分隔的字段约束。其中,域是指存储在该列的信息的类型,约束用来控制什么样的值可以存储在表中或特定的字段中。

  一条创建表的命令示例如下:

1   CREATE TABLE tab_student (studentId INTEGER PRIMARY KEY AUTOINCREMENT, 
2                             studentName VARCHAR(20), 
3                             studentAge INTEGER);

  如上,我们创建了一个名为tab_student的表,该表包含3个字段:studentId、 studentName和studentAge,其数据类型分别为:INTEGER、VARCHAR(也可不加数字)和INTEGER。

  此外,通过使用关键字PRIMARY KEY,我们指定了字段studentId所在的列是主键。主键确保了每一行记录在某种方式上与表中的其他行记录是不同的(唯一的),进而确保了表中的所有字段都是可寻址的。

  SQLite为主键提供自增长功能,当定义字段类型为INTEGER PRIMARY KEY时,SQLite将为该字段创建默认值,该默认值确保整数值是唯一的。SQLite使用64-bit单符号整数主键,因此,该字段的最大值是9,223,372,036,854,775,807。当达到最大值时,SQLite会自动搜索该字段还未使用的值,并作为要插入的值。从表中删除记录时,rowid可能被回收并在后面的插入中使用。因此,新创建的rowid不一定是按照严格顺序增长的。如果想要SQLite使用唯一的自动主键值,而不是填补空白,可以在主键定义INTEGER PRIMARY KEY中加入关键字AUTOINCREMENT。AUTOINCREMENT关键字阻止rowid回收,它将为新插入的记录产生新的(不是回收的)rowid。

1.2.2插入记录

  使用INSERT命令可以一次插入一条记录,INSERT命令的一般格式为:

  INSERT INTO tab_name (column_list) VALUES (value_list);

  其中,tab_name指明将数据插入到哪个表中,column_list是用逗号分隔的字段名称,这些字段必须是表中存在的,value_list是用逗号分隔的值列表,这些值是与column_list中的字段一一对应的。

  比如,向刚才创建的tab_student表中插入一条记录,便可以使用如下的语句完成:


  INSERT
INTO tab_student (studentId, studentName, studentAge) VALUES (1, “jack”, 23);

  通过以上的语句,便插入了一条studentName=”jack”, studentAge=”23”的记录,该记录的主键为studentId=1。

1.2.3更新记录

  使用UPDATE命令可以更新表中的记录,该命令可以修改一个表中一行或者多行中的一个或多个字段。UPDATE命令的一般格式为:

  UPDATE tab_name SET update_list WHERE predicate;

  其中,update_list是一个或多个字段赋值的列表,字段赋值的格式为column_name=value。WHERE子句使用断言识别要修改的行,然后将更新列应用到这些行。

  比如,要更新刚才插入到tab_student表中的记录,便可以使用如下的语句完成:


  UPDATE
tab_student SET studentName=”tom”, studentAge=25WHERE studentId=1;

  通过以上的语句,便可以将刚才插入的主键为studentId=1的记录更新为studentName=”tom”, studentAge=”25”了。

1.2.4删除记录

  使用DELETE命令可以删除表中的记录,DELETE命令的一般格式为:

  DELETE FROM table_name WHERE predicate;

  其中,table_name指明所要删除的记录位于哪个表中。和UPDATE命令一样,WHERE子句使用断言识别要删除的行。

  比如,要删除刚才插入的记录,便可以使用如下的语句完成:

  
  DELETE FROM tab_student WHERE studentId=1;
   DELETE FROM tab_student; // 删除整张表

1.2.5查询记录    查看下文补充链接

  SELECT命令是查询数据库的唯一命令。SELECT命令也是SQL命令中最大、最复杂的命令。

  SELECT命令的通用形式如下:

  SELECT [distinct] heading 

  FROM tables 

  WHERE predicate     比如:WHERE Id = 2 AND dayLight= 0

  GROUP BY columns 

  HAVING predicate 

  ORDER BY columns 

  LIMIT count,offset;

  其中,每个关键字(如FROM、WHERE、HAVING等)都是一个单独的子句,每个子句由关键字和跟随的参数构成。GROUP BY和HAVING一起工作可以对GROUP BY进行约束。ORDER BY使记录集在返回之前按一个或多个字段的值进行排序,可以指定排序方式为ASC(默认的升序)或DESC(降序)。此外,还可以使用LIMIT限定结果集的大小和范围,count指定返回记录的最大数量,offset指定偏移的记录数。

  在上述的SELECT命令通用形式中,除了SELECT之外,所有的子句都是可选的。目前最常用的SELECT命令由三个子句组成:SELECT、FROM、WHERE,其基本语法形式如下:

  SELECT heading FROM tables WHERE predicate;

SELECT * FROM table_name;  //会列出表的所有数据

SELECT column1, column2, columnN FROM table_name;  //会查询出表中所有行的column1、column2、column3列的信息

     比如,要查询刚才插入的记录,便可以使用如下的语句完成:添加where字句

  
  SELECT
studentId, studentName, studentAge FROM tab_student WHERE studentId=1; //只查id为1的...

  至此,我们介绍了SQL中最基本和最常用的CREATE、INSERT、UPDATE、DELETE和SELECT命令。当然了,这里只是对其进行了简单的介绍,有关SQLite中SQL命令的详细使用方法,可以参阅《SQLite权威指南》一书的第三章和第四章。

补充:最后记得查看SQL详细讲解及实际举例应用:http://blog.csdn.net/pashanhuxp/article/details/39643603   *********


 2.SQLiteDatabase的使用     

对数据库的操作可以直接使用相应的SQL语句,Android也为不熟悉SQL语句的开发者提供了相应的封装方法,所以一般都有两种法。

以下转自:http://www.sqlite.com.cn/MySqlite/4/564.Html

2.1创建和打开数据库

在Android 中创建和打开一个数据库都可以使用openOrCreateDatabase 方法来实现,因为它会自动去检测是否存在这个数据库,如果存在则打开,不过不存在则创建一个数据库;创建成功则返回一个 SQLiteDatabase对象,否则抛出异常FileNotFoundException。下面我们来创建一个名为”Examples_06_05.db”的数据库,并返回一个SQLiteDatabase对象 mSQLiteDatabase。

mSQLiteDatabase = this.openOrCreateDatabase("Example_06_05.db", MODE_PRIVATE, null);
或者调用SQLiteDatabae静态方法:
public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory)

2.2创建表

一个数据库中可以包含多个表,我们的每一条数据都保存在一个指定的表中,要创建表可以通过execSQL 方法来执行一条SQL语句。execSQL能够执行大部分的SQL语句,下面我们来创建一个名为table1 且包含3个字段的表。 具体代码如下:

String CREATE_TABLE = "CREATE TABLE table1 (_id INTEGER PRIMARY KEY, num INTEGER, data TEXT)"; mSQLiteDatabase.execSQL(CREATE_TABLE);
2.3向表中添加一条数据

可以使用insert 方法来添加数据,但是 insert 方法要求把数据都打包到 ContentValues 中, ContentValues 其实就是一个Map, key值是字段名称, Value值是字段的值。通过 ContentValues 的 put 方法就可以把数据放到ContentValues中,然后插入到表中去。具体实现如下:

	ContentValues cv = new ContentValues(); 
	cv.put(TABLE_NUM, 1); 
	cv.put(TABLE_DATA, "测试数据"); 
	mSQLiteDatabase.insert(TABLE_NAME, null, cv); 
	//这样同样可以使用execSQL方法来执行一条“插入”的SQL语句,代码如下:
	String INSERT_DATA = "INSERT INTO table1 (_id, num, data) values (1, 1, '通过SQL语句插入')" ; 
	mSQLiteDatabase.execSQL(INSERT_DATA);


2.4从表中删除数据

要删除数据可以使用delete 方法,下面我们删除字段 “_id” 等于1的数据,具体代码如下:

	mSQLiteDatabase.delete("Examples_06_05.db", " where_id="+0, null); 
	//或者通过 execSQL方法执行SQL语句删除数据如下: 
	String DELETE_DATA = "DELETE FROM table1 WHERE _id=1"; 
	mSQLiteDatabase.execSQL(DELETE_DATA);


2.5修改表中的数据

如果添加了数据后发现数据有误,这时需要修改这个数据,可以使用updata方法来更新一条数据。下面我们来修改 “num” 值为0的数据,具体代码如下:

ContentValues cv = new ContentValues(); 
cv.put(TABLE_NUM, 3); 
cv.put(TABLE_DATA, "修改后的数据"); 
mSQLiteDatabase.update("table1", cv, "num " + "=" + Integer.toString(0), null);


2.6关闭数据库

关闭数据库很重要,也是大家经常容易忘记的。关闭的方法很简单,直接使用SQLiteDatabase 的 close 方法。具体代码如下:

mSQLiteDatabase.close();
2.7删除指定表

这里我们使用execSQL方法来实现,具体代码如下:

mSQLiteDatabase.execSQL("DROP TABLE table1");

2.8删除数据库

要删除一个数据库,直接使用deleteDatabase方法即可,具体代码如下:

this.deleteDatabase("Examples_06_05.db");


2.9补充:查询数据库***

方法一:public Cursor query(boolean distinctString table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);

参数说明:

distinct:使返回的结果是原结果的一个不含相同行的子集。比如订单表中,一个客户可能会有好几份订单,因此客户的名字会重复出现。

table:数据库表的名称

columns:数据库列名称数组 写入后最后返回的Cursor中只能查到这里的列的内容 (举例:new String[] {"name","hp"} 这样的话得到的Cursor 中的数据只会存有 数据库表中"name " 与 "hp"两个字段)

selection:查询条件 相当于条件字句,比如"id=?" //精确查找 "name like ?" //模糊查找    //红色代表关键字

selectionArgs: 相当于条件字句的参数值   比如new String[]{"1"}  new String[]{"%传智%"}

groupBy:分组列  相当于select语句group by关键字后面的部分    常用来做统计。 //不常用,常置为null

having:分组条件  相当于select语句having关键字后面的部分    用来做统计结果的条件限制

orderBy:排序列  相当于select语句order by关键字后面的部分,如:“personid desc“(按personid 倒序排,从大到小), “age asc”(按age正序排,从小到大); 

limit:分页查询限制  指定偏移量和获取的记录数  比如limit 0,10表示从第0条记录开始,往后一共读取10条。


方法二:rawQuery(String sql, String[] selectionArgs)          直接使用SQL语句查询。   <raw意思是“生的,未加工处理的”>

2.10补充:Cursor
cursor类似一个集合,会把符合条件的查询结果,重新排列。
可以通过moveToNext()遍历整张查询结果表。
其他方法看android API




3.SQLiteOpenHelper的使用
3.1介绍:
SQLiteOpenHelper是一个数据库管理的帮助类,提供了创建数据库的接口,并且更重要的是有数据库的版本更新功能
由于SQLiteOpenHelper只是一个辅助类。对数据库的具体操作还是通过SQLiteDatabase来操作的。
在使用中,也可以不使用这个类,而直接使用SQLiteDatabase。如果使用这个类,则可以更好的帮助我们管理数据库。
SQLiteOpenHelper经常和ContentProvider结合使用。

SQLiteOpenHelper是一个抽象类,有两个重要方法分别是 onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)。


3.2使用方法:
3.2.1所有继承了这个类的类都必须实现下面这样的一个构造方法: 
public DatabaseHelper(Context context, String name, CursorFactory factory, int version) 

3.2.2实现两个抽象方法:

onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行。

onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。



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

onUpgrade()方法

onUpgrade()方法在数据库的版本发生变化时会被调用,数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的需要,修改了数据库表的结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(或其他数值),并且在onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。
我们是在SQLiteOpenHelper的构造方法参数中,传入这个版本号。通过修改这个版本号,来自动实现onUpgrade升级
建议自定义一个常量
DATABASE_VERSION 来管理数据库版本,比较方便的方法是可以将app的versioncode作为数据库版本,每次对数据库的更新,都务必修改这个版本号。当app版本升级时,不修改版本号,数据库是不会更改的,也就是不会自己去执行onCreate()和onUpgrade()的,这时很容易反生崩溃。

注意:
onCreateonUpgrade()都是当满足特定条件,由系统自己调用的。
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的 SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。
这时可以采用如下:
dbHelper = new myDbHelper(context, DATABASE_NAME, null, DATABASE_VERSION);
SQLiteDatabase db;
try
{
   db = dbHelper.getWritableDatabase();
}
catch (SQLiteException ex)
{
   db = dbHelper.getReadableDatabase();
}
在后台,如果数据库不存在,辅助类会执行它的onCreate方法。如果数据库的版本发生了变化,onUpgrade 方法会触发。在两种情况下, get<Read/Write>ableDatabase 的调用会相应的返回已经存在的、新创建的或者更新了的数据库。

3.3SQLiteOpenHelper代码Demo:
class MySQLiteHelper extends SQLiteOpenHelper {

    public MySQLiteHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    public MySQLiteHelper(Context context, String name, CursorFactory factory, int version,
            DatabaseErrorHandler errorHandler) {
        super(context, name, factory, version, errorHandler);
    }
    
    @Override
    public void onCreate(SQLiteDatabase db) {
      // 自动被调用
      // 通常是在该方法里创建多个表,以备当调用getWritableDatabase或ReadableDatabase时,没有表而被系统自动调用创建表
      db.execSQL("CREATE TABLE IF NOT EXISTS tab_student (studentId INTEGER PRIMARY KEY AUTOINCREMENT"
              + "studentName VARCHAR(20)" + "studentAge INTEGER)");        
        
    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 当版本号不一致时会自动调用
        // 好方便我们对数据库进行升级,比如,更换表的操作,或是升级数据库时,把表全部删除进行重建等操作。 * SQL升级语句,
        // 比如:"DROP TABLE IF EXISTS "+"TableName"
        db.execSQL("DROP TABLE IF EXISTS "+"tab_student");
        this.onCreate(db);
    }


}




  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLite 是一种轻型的关系型数据库管理系统,适用于嵌入式设备和移动设备。使用 SQLite 存储数据需要以下步骤: 1. 导入 SQLite 库:在你的项目中导入 SQLite 库,可以使用系统自带的 SQLite 库,也可以使用第三方库。 2. 创建数据库:在代码中使用 SQLiteOpenHelper 类创建数据库,并指定数据库的名称和版本号。 3. 创建表:在数据库中创建表,定义表的结构和字段。 4. 插入数据使用 SQL 语句向表中插入数据。 5. 查询数据使用 SQL 语句查询数据。 6. 更新数据使用 SQL 语句更新数据。 7. 删除数据使用 SQL 语句删除数据。 下面是一个简单的示例代码: ```java public class DBHelper extends SQLiteOpenHelper { // 数据库名称 public static final String DB_NAME = "my_db"; // 数据库版本号 public static final int DB_VERSION = 1; // 表名 public static final String TABLE_NAME = "my_table"; // 字段名 public static final String COLUMN_ID = "id"; public static final String COLUMN_NAME = "name"; public static final String COLUMN_AGE = "age"; // 创建表的 SQL 语句 private static final String CREATE_TABLE_SQL = "CREATE TABLE " + TABLE_NAME + " (" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_NAME + " TEXT, " + COLUMN_AGE + " INTEGER)"; public DBHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建表 db.execSQL(CREATE_TABLE_SQL); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 升级数据库 db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } public void insertData(String name, int age) { SQLiteDatabase db = getWritableDatabase(); ContentValues values = new ContentValues(); values.put(COLUMN_NAME, name); values.put(COLUMN_AGE, age); db.insert(TABLE_NAME, null, values); db.close(); } public List<Person> queryData() { List<Person> list = new ArrayList<>(); SQLiteDatabase db = getReadableDatabase(); Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null); if (cursor != null) { while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex(COLUMN_ID)); String name = cursor.getString(cursor.getColumnIndex(COLUMN_NAME)); int age = cursor.getInt(cursor.getColumnIndex(COLUMN_AGE)); Person person = new Person(id, name, age); list.add(person); } cursor.close(); } db.close(); return list; } public void updateData(int id, String name, int age) { SQLiteDatabase db = getWritableDatabase(); ContentValues values = new ContentValues(); values.put(COLUMN_NAME, name); values.put(COLUMN_AGE, age); db.update(TABLE_NAME, values, COLUMN_ID + "=?", new String[]{String.valueOf(id)}); db.close(); } public void deleteData(int id) { SQLiteDatabase db = getWritableDatabase(); db.delete(TABLE_NAME, COLUMN_ID + "=?", new String[]{String.valueOf(id)}); db.close(); } } ``` 在这个示例代码中,我们创建了一个 DBHelper 类,继承自 SQLiteOpenHelper 类。在 onCreate() 方法中创建了一个表,包含 id、name 和 age 三个字段。在 insertData() 方法中插入数据使用 queryData() 方法查询数据使用 updateData() 方法更新数据使用 deleteData() 方法删除数据使用 SQLiteDatabase 类获取数据库对象,使用 ContentValues 类封装数据使用 Cursor 类查询数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值