android中的数据存取 之 SQLite

来源:互联网 发布:银联数据 10个月年终奖 编辑:程序博客网 时间:2024/06/05 03:13

1.Android中通过SQLite数据库引擎来实现结构化数据存储。SQLite是一个嵌入式数据库引擎,针对内存等资源有限的设备,提供的是一种高效的数据库引擎。
2.Android提供了创建和使用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法,另外还有一个SQLiteOpenHelper工具类提供更简洁的功能。
3. SQLiteOpenHelper是SQliteDatabase的一个帮助类,用来管理数据库的创建和版本更新。一般用法是定义一个类继承之,并实现两个抽象方法onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)类创建和跟新数据库。

Android中操作数据库首先要通过一个 类:android.database.sqlite.SQLiteOpenHelper。它封装了如何打开一个数据库,其中当然也包含如果数据库不存在 就创建这样的逻辑。

SQLiteOpenHelper 类

其中:

getReadableDatabase()得到可读的数据库,返回SQLiteDatabase对象,然后通过对象进行数据库操作。

getWritableDatabase()得到可写的数据库,返回SQLiteDatabase对象,然后通过对象进行数据库操作。

onCreate(SQLiteDatabase db)在第一次创建数据库时调用。

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)在更改数据库时都会调用。

onOpen(SQLiteDatabase db)当数据库打开时调用。

close()关闭数据库。


看一个例子:

public class SqlLiteHelper extends SQLiteOpenHelper {public class DatabaseHelper extends SQLiteOpenHelper {        private static final int VERSION = 1;        public DatabaseHelper(Context context, String name, CursorFactory factory,              int version) {          super(context, name, factory, version);      }        @Override      public void onCreate(SQLiteDatabase db) {          System.out.println("create a Database");          db.execSQL("create table user(id int,name varchar(20))");      }        @Override      public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {          System.out.println("update a Database");          db.execSQL("DROP TABLE IF EXISTS user");    }    }  }

这里面,如下的语句需要解释:

super(context, DATABASE_NAME, null, DATABASE_VERSION)

数据库连接的初始化,中间的那个null,是一个CursorFactory参数,没有仔细研究这个参数,暂时置空吧。

public void onCreate(SQLiteDatabase db)

这里面的onCreate是指数据库onCreate时,而不是DatabaseHelper的onCreate。也就是说,如果已经指定 database已经存在,那么在重新运行程序的时候,就不会执行这个方法了。要不然,岂不是每次重新启动程序都要重新创建一次数据库了!在这个方法中,完成了数据库的创建工作。也就是那个execSQL()方法。

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

在程序的开发维护过程中,数据库的结构可能会有变化,那么这个方法就有用处了。在DatabaseHelper这个对象一创建时,就已经把参数 DATABASE_VERSION传入,这样,如果Android发现此版本与现有版本不一致,就会调用这个onUpgrate方法。于是,可以在这里面实现一些数据的upgrade工作,比如说创建一个临时表,将数据由临时表中转到新的表结构中。需要注意的是,这里面的onUpgrade是在版本不一致时调用,也就是说不管当前需要的版本高于现有版本还是低于现有版本,都会出发这个方法,类似的这种情况,就需要对oldVersion和 newVersion进行判断之后再决定使用什么策略来更新数据。


接下来就可以使用这个Helper来操作数据库了,操作数据库也就无非是增、删、改、查。

SQLiteDatabase类

这个类提供了对数据库的一些基本操作:

insert()

delete()

update()

query()

。。。。。等等。


请看下面范例:


          SQLiteDatabase db = dbHelper.getWritableDatabase();                      ContentValues values = new ContentValues();            values.put("name", "张 san feng");            db.update("user", values, "id=?", new String[] { "1" });  

   ContentValues values = new ContentValues();             values.put("id", 1);             values.put("name", "zzq");              db.insert("user", null, values);  

    Cursor cursor = db.query("user", new String[] { "id", "name" },                      "id=?", new String[] { "1" }, "", "", "");      while (cursor.moveToNext()) {             String name = cursor.getString(cursor.getColumnIndex("name"));     }

ContentValues values = new ContentValues();
Android在向数据库中插入数据的时候,要求数据存放到ContentValues中,这里面的ContentValues其实就是一个 Map,Key值是字段名称,Value值是字段的值。这样,也许你会发现一个问题,那数据类型怎么办?其实在SQLite数据库中就是没有数据类型的, 一切都是字符串。

db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)

table:表名。相当于SQL的from后面的部分。那如果是多表联合查询怎么办?那就用逗号将两个表名分开,拼成一个字符串作为table的值,不可为null
columns:要查询出来的列名。相当于SQL的select后面的部分。置null表示返回所有列。
selection:查询条件,where子句,如果不需要where子句则置null,写法如"id=?",此处将要填的参数写为?,供下方的selectionArgs填充
selectionArgs:对应于selection的值,selection有几个问号,这里就得用几个值。两者必须一致,否则就会有异常。
groupBy:相当于SQL的group by子句
having:相当于SQL的having子句
orderBy:相当于SQL的order by子句,如果是倒序,或者是联合排序,可以写成类似这样:String orderBy = “id desc, name”;


使用adb访问Sqlite 
    * Dos下运行adb shell命令

    * 进入/data/data/****/目录

    * 命令: sqlite3 dbname 进入sqlite命令


Cursor常用方法
move 以当前位置为参考,将Cursor移动到指定的位置,成功返回true,失败返回false

moveToPosition 将Cursor移动到指定的位置,成功返回true,失败返回false

moveToNext 将Cursor向前移动一个位置,成功返回true,失败返回false

moveToLast 将Cursor向后移动一个位置,成功返回true,失败返回false

moveToFirst 将Cursor移动到第一行,成功返回true,失败返回false

isBeforeFirst 返回Cursor是否指向第一项数据之前

isAfterLast 返回Cursor是否指向最后一项数据之后

isClosed 返回Cursor是否关闭

isFirst 返回Cursor是否指向第一项数据

isLate 返回Cursor是否指向最后一项数据

isNull 返回指定位置的值是否为Null

getCount 返回总的数据项数

getInt 返回当前行中指定索引的数据


原创粉丝点击