Android SQLite 数据库详细介绍

Android SQLite 数据库详细介绍
我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为我们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版本进行管理来实现前面提出的需求。
下面我们来看一下Android SQLite 最常用的几个类和那些方法:
一、SQLiteOpenHelper :
    onCreate(SQLiteDatabase db);
            用于初次使用软件时生成数据库表。
            当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,                   Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,
    在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据
    onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号getWritableDatabase();                                 getReadableDatabase();两方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。二、SQLiteDatabase:
在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号
    getWritableDatabase();
    getReadableDatabase();
        两方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
二、SQLiteDatabase:
    1、db.insert(table, nullColumnHack, values)第一个参数是表名称,第二个参数是空列的默认值,第三个参数是ContentValues类型的一个封装了列名称和列值的Map;
第一个参数是表名称,第二个参数是空列的默认值,第三个参数是ContentValues类型的一个封装了列名称和列值的Map;
    2、db.delete(table, whereClause, whereArgs)第一个参数是表名称,第二个参数是删除条件,第三个参数是删除条件值数组
第一个参数是表名称,第二个参数是删除条件,第三个参数是删除条件值数组
    3、db.update(table, values, whereClause, whereArgs)第一个参数是表名称,第二个参数是更行列ContentValues类型的键值对(Map),第三个参数是更新条件(where字句),第四个参数是更新条件数组
第一个参数是表名称,第二个参数是更行列ContentValues类型的键值对(Map),第三个参数是更新条件(where字句),第四个参数是更新条件数组
    4、db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)(下面有对该方法详细讲解)
    5、db.execSQL(sql) // 执行任何SQL语句
    6、db.rawQuery(sql, selectionArgs)对第四个方法详细讲解:Cursor query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)
对第四个方法详细讲解:
Cursor query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)
各个参数的意义说明:
①table:表名称
②columns:列名称数组
③selection:条件字句,相当于where
④selectionArgs:条件字句,参数数组
⑤groupBy:分组列
⑥having:分组条件
⑦orderBy:排序列
⑧limit:分页查询限制
三、Cursor:

Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.
Cursor游标常用方法:
getCount() 总记录条数
isFirst() 判断是否第一条记录
isLast() 判断是否最后一条记录
moveToFirst() 移动到第一条记录
moveToLast() 移动到最后一条记录
move(int offset) 移动到指定记录moveToNext() 移动到下一条记录moveToPrevious() 移动到上一条记录getColumnIndexOrThrow(String columnName) 根据列名称获得列索引
moveToNext() 移动到下一条记录
moveToPrevious() 移动到上一条记录
getColumnIndexOrThrow(String columnName) 根据列名称获得列索引
getInt(int columnIndex) 获得指定列索引的int类型值getString(
getString(
getString(int columnIndex) 获得指定列缩影的String类型值

        



怎么获得数据库表的字段名:
Cursor cursor = db.rawQuery(sql, null);
这就获得一个关于表字段的表,字段的信息可以通过游标来获取
            
                while(cursor.moveToNext()){
                    String name  = cursor.getString(cursor.getColumnIndex("name"));
                  
                }           
        }
这个需要注意啦,在moveToNext()后,我居然在有表里调试,发现了游标的获得列信息如下: 

        

String sql  = "PRAGMA table_info(\'"+mTableName()+"\')";
if(cursor != null){
name 表示字段 type是字段类型我还能理解,其他的是什么东东啊。
Android SQLite 数据库详细介绍
        
        
        
上一篇:angularJS ng-repeat中的directive 动态加载template


下一篇:Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 2 -使用XQuery 查询XML数据