本帖最后由 地狱怒兽 于 2009-6-2 02:01 编辑
数据库编程基础
SQLite数据库
- 在某些情况下,文件不是有效的
Ø 如果多线程数据访问是相关的 Ø 如果应用程序处理可能变化的复杂数据结构 Ø 等等 - 因此,Android带来了内置SQLite数据库支持
- 数据库对于创建它们的包套件是私有的
- 数据库不应该用来存贮文件
- 提示:在SDK中的samples/NotePad下可以找到关于如何使用数据库的例子
- SQLite是一个轻量级的软件库
- 实现了一个完全适应严峻环境的数据库
Ø 原子量性 Ø 坚固性 Ø 独立性 Ø 耐久性 - 体积大小只用几千字节
- 一些SQL的指令只是部分支持,例如:ALTER、TABLE
- 参阅 http://www.sqlite.org 获取更多信息
创建数据库
- Context.createDatabase(String name,int version ,int mode,CursorFactory factory)创建一个新的数据库并返回一个SQLiteDatabase对象
- 假如数据库不能被创建,则抛出FileNotFoundException异常
- 新创建SQLite数据库方法
- SQLiteDatabase myDataBase=this.openOrCreateDatabase("myDataBase.db",
- MODE_PRIVATE, new CursorFactory(){
- //创建新的数据库,名称myDatabase,模式MODE_PRIVATE,鼠标工厂
- //工厂类,一个可选工厂类,当查询时调用来实例化一个光标
- @Override
- public Cursor newCursor(SQLiteDatabase db,
- SQLiteCursorDriver masterQuery, String editTable,
- SQLiteQuery query) {
- // TODO Auto-generated method stub
- return null;
- }
- });
复制代码
删除数据库
- Context.deleteDatabase(String name)删除指定名称的数据库
- 假如数据库成功删除则返回true,失败则为false(例如数据库不存在)
- //删除指定名称的数据库
- this.deleteDatabase("myDatabase.db");
复制代码
打开数据库
- Context.openDatabase(String file,CursorFactory factory)打开一个存在的数据库并返回一个SQLiteDatabase对象
- 如果数据库不存在则抛出FileNotFoundException异常
- //创建一个名为:myDataBase的数据库,后缀为.db
- SQLiteDatabase my_DataBase=this.openOrCreateDatabase("myDateBase.db",
- MODE_PRIVATE, null);
- my_DataBase.close();//不要忘记关闭数据库
复制代码
非查询SQL指令
- SQLiteDatabase.execSQL(String sql)可以用来执行非查询SQL指令,这些指令没有结果
- 包括:CREATE TABLE / DROP TABLE / INSERT 等等
- 例如:
- 创建一个名为"test"并带两个参数的表
- //创建一个名为"test"并带两个参数的表
- my_DataBase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY,
- someNumber INTERGER);");
复制代码
- 在数据库中插入一个元组
- //在数据库中插入一个元组
- my_DataBase.execSQL("INSERT INTO test (_id,someNumber) values(1,8);");
复制代码
- 删除表
- //删除表
- my_DataBase.execSQL("DROP TABLE test");
复制代码
查询SQL指令-游标Cursors
- Android 使用游标(Cursors)来导航浏览查询结果
- 游标(Cursors)被android.database.Cursor对象来描述
- 一个游标(Cursors)是一个简单的指针,它从查询结果的一个元组跳到下一个元组(或是前一个或是第一个或是……)
- 游标(Cursors)在它定位位置的那一刻返回元组数据
表 test |
| _id | someNumber |
| 1 | 8 | | 2 | 10 | | 3 | 2 |
|
- //为了创建一个Cursor(游标),必须执行一个查询,要么通过SQL使用rawQuery()方法
- //或是更精心设计的方法,像query()方法
- Cursor cur=my_DataBase.rawQuery("SELECT * FORM test", null);
- if(cur!=null){//游标不为空
- //返回给定名称的列的基于0开始的index,如果该属性列不存在则返回-1
- //通过它们的index来检索属性值
- int numColumn=cur.getColumnIndex("someNumber");
- if(cur.moveToFirst()){
- //cur.moveToFirst()让游标指向第一行,如果游标指向第一行,则返回true
- do {
- int num=cur.getInt(numColumn);//获得当前行该属性的值
- /*Cursor提供了不同的方法来回索不同的数据类型
- 例如getInt(int index)/getString(int index)等等*/
- /*做一些事情*/
- } while (cur.moveToNext());
- /*游标移动到下一行,如果游标已经通过了结果集中的最后,
- 即没有行可以移动时,则返回false*/
- //其他可能移动的是 previous() 和first()方法
- }
- }
复制代码
数据库应用示例
部分代码
- //把新输入的联系人信息加入到数据库
- private void addToDataBase(String name_str2, String phone_str2, String email_str2, String address_str2) {
- // TODO Auto-generated method stub
- String sqlCmd="INSERT INTO myPhoneBook(Pname,Pphone,Pemail,Paddress) values('"+name_str2+"','"+phone_str2+"','"+email_str2+"','"+address_str2+"');";
- try {
- myPhoneBookDB.execSQL(sqlCmd);
- ShowNoteInformation("添加成功!!");
- } catch (Exception e) {
- // TODO: handle exception
- ShowNoteInformation("添加失败,记录已经存在!!");
- }
- Log.i("MYTEST", sqlCmd);
- }
复制代码
- setMainScreen(R.layout.persionlist);
- setActionListener(R.layout.persionlist);
- //实例化ArrayList
- arraylistmap=new ArrayList<Map<String,Object>>();
- ShowNoteInformation("查看电话");
- //为了创建一个Cursor(游标),必须执行一个查询,要么通过SQL使用rawQuery()方法
- //或是更精心设计的方法,像query()方法
- myCursor=myPhoneBookDB.rawQuery("SELECT * FROM myPhoneBook", null);
- if(myCursor!=null){//游标不为空
- //返回给定名称的列的基于0开始的index,如果该属性列不存在则返回-1
- //通过它们的index来检索属性值
- int numColumn_name=myCursor.getColumnIndex("name");
- int numColumn_phone=myCursor.getColumnIndex("phone");
- int numColumn_email=myCursor.getColumnIndex("email");
- int numColumn_address=myCursor.getColumnIndex("address");
-
- if(myCursor.moveToFirst()){
- //cur.moveToFirst()让游标指向第一行,如果游标指向第一行,则返回true
- do {
- //获得当前行该属性的值
- /*Cursor提供了不同的方法来回索不同的数据类型
- 例如getInt(int index)/getString(int index)等等*/
-
- my_name = myCursor.getString(numColumn_name);
- my_phone = myCursor.getString(numColumn_phone);
- my_email = myCursor.getString(numColumn_email);
- my_address = myCursor.getString(numColumn_address);
-
- myMap =new HashMap<String, Object>();
- myMap.put("Name",my_name );
- myMap.put("hone",my_phone );
- myMap.put("Email",my_email );
- myMap.put("Address",my_address );
- arraylistmap.add(myMap);
- /*做一些事情*/
- } while (myCursor.moveToNext());
- /*游标移动到下一行,如果游标已经通过了结果集中的最后,
- 即没有行可以移动时,则返回false*/
- //其他可能移动的是 previous() 和first()方法
- }
- }
- adapter=new SimpleAdapter(this, arraylistmap, android.R.layout.simple_list_item_1, new String[]{"Name"}, new int []{android.R.id.text1});
- mylist.setAdapter(adapter);
复制代码
- ShowNoteInformation("删除该电话记录");
- myPhoneBookDB.execSQL("DELETE FROM myPhoneBook WHERE Pname='"+my_name+"';");
- Log.i("MYTEST", "DELETE FROM myPhoneBook WHERE Pname='"+my_name+"';");
- cleanShow();
复制代码
|