实例讲解Android App使用自带的SQLite数据库的基本方法
sqlite数据库是android系统内嵌的数据库,小巧强大,能够满足大多数sql语句的处理工作,而sqlite数据库仅仅是个文件而已。虽然sqlite的有点很多,但并不是如同pc端的mysql般强大,而且android系统中不允许通过jdbc操作远程数据库,所以只能通过webservice等手段于php、servlet交互获取数据。
基础
sqlitedatabase类,代表了一个数据库对象,通过sqlitedatabase来操作管理数据库。
一些基本的用法:
- static sqlitedatabase opendatabase(string path,sqlitedatabase.cursorfactory factory,int flag);
- static sqlitedatabase openorcreatedatabase(file file,sqlitedatabase.cursorfactory factory);
- static sqlitedatabase openorcreatedatabase(string path,sqlitedatabse.cursorfactory factory);
通过这些静态方法可以很方便的打开和新建一个数据库。
- execsql(string sql,object[] bindargs)
- execsql(string sql)
- rawquery(string sql,string[] selectionargs);
- begintransaction()
- endtransaction()
这些函数可以完成sql功能,对于查询出来的结果是用cursor表示的,类似于jdbc中的resultset类,在这些类中通过方法move(int offset)、movetofirst()、movetolast()、movetonext()、movetoposition(int position)、movetoprivious()获取需要的结果行。
下面通过一个实例来说明一下sqlitedatabase的基本使用:
main.xml:
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".main" > <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="key" /> <edittext android:id="@+id/keys" android:layout_width="100sp" android:layout_height="wrap_content" /> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="value" /> <edittext android:id="@+id/values" android:layout_width="100sp" android:layout_height="wrap_content" /> <button android:id="@+id/btn" android:layout_width="100sp" android:layout_height="wrap_content" android:text="submit" /> </linearlayout> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" > <listview android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="wrap_content" /> </linearlayout> </linearlayout>
用于填充数据的mytextview.xml:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <textview android:id="@+id/listkey" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left" /> <textview android:id="@+id/listvalue" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginleft="300sp" /> </linearlayout>
main.java
package com.app.main; import android.annotation.suppresslint; import android.app.activity; import android.database.cursor; import android.database.sqlite.sqlitedatabase; import android.os.bundle; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.cursoradapter; import android.widget.edittext; import android.widget.listview; import android.widget.simplecursoradapter; public class main extends activity { edittext ed1 = null; edittext ed2 = null; button btn = null; listview lv = null; sqlitedatabase db = null; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); ed1 = (edittext) this.findviewbyid(r.id.keys); ed2 = (edittext) this.findviewbyid(r.id.values); btn = (button) this.findviewbyid(r.id.btn); lv = (listview) this.findviewbyid(r.id.lv); db = sqlitedatabase.openorcreatedatabase(this.getfilesdir().tostring() + "/my.db3", null); btn.setonclicklistener(new onclicklistener() { @override public void onclick(view view) { string key = ed1.gettext().tostring(); string value = ed2.gettext().tostring(); try { insertdata(db, key, value); cursor cursor = db.rawquery("select * from tb_info", null); inflatelistview(cursor); } catch (exception e) { string sql = "create table tb_info(_id integer primary key autoincrement,db_key varchar(20),db_value varchar(50))"; db.execsql(sql); insertdata(db, key, value); cursor cursor = db.rawquery("select * from tb_info", null); inflatelistview(cursor); } } }); } // 向数据库中插入数据 private void insertdata(sqlitedatabase db, string key, string value) { db.execsql("insert into tb_info values (null,?,?)", new string[] { key, value }); system.out.println("------------------"); } // 向listview中填充数据 @suppresslint("newapi") public void inflatelistview(cursor cursor) { simplecursoradapter adapter = new simplecursoradapter(main.this, r.layout.mytextview, cursor, new string[] { "db_key", "db_value" }, new int[] { r.id.listkey, r.id.listvalue }, cursoradapter.flag_register_content_observer); lv.setadapter(adapter); } @override protected void ondestroy() { super.ondestroy(); if (db != null && db.isopen()) { db.close(); } } }
实现的效果:
需要特别指出,在用simplecursoradapter封装cursor的时候,要求底层数据库表的主键列的列名为_id,因为simplecursoradapter只能识别主键列名为_id的表。
进阶
直接使用sqlitedatabase的openorcreatedatabase可以直接打开或者是新建一个sqlitedatabase,但是这里存在一个缺点。在每次执行sql语句的时候都需要在try catch语句中进行,如果在try中直接操作的数据库或者表不存在,就需要在catch中重新创建表并且执行crud操作,并且有关数据库的每一个方法都要这么做,重复的代码太多了,所以实际的开发中大都选用sqliteopenhelper类。
主要方法:
- synchronized sqlitedatabase getreadabledatabase():以读写的方式打开数据库。
- synchronized sqlitedatabase getwritabledatabase();以写的方式打开数据库。
- abstract void oncreate(sqlitedatabase db) 当第一次创建数据库的时候回调该方法。
- abstract void onuprade(sqlitedatabase db,int oldversion,int newversion) 数据库版本更新的时候回调该方法。
- abstract void close() 关闭所有打开的sqlitedatabase.
使用方法:
1)继承sqliteopenhelper。在构造方法中的参数string name就是数据库的名称。
2)重写oncreate和onupgrade方法。
mysqliteopenhelper类:
package com.app.db; import android.content.context; import android.database.sqlite.sqlitedatabase; import android.database.sqlite.sqlitedatabase.cursorfactory; import android.database.sqlite.sqliteopenhelper; public class mysqliteopenhelper extends sqliteopenhelper { string createsql = "create table tb_test(_id integer primary key autoincrement ,name,age )"; public mysqliteopenhelper(context context, string name, cursorfactory factory, int version) { super(context, name, factory, version); } @override public void oncreate(sqlitedatabase db) { db.execsql(createsql); } @override public void onupgrade(sqlitedatabase arg0, int arg1, int arg2) { } }
main.java
package com.app.main; import android.app.activity; import android.database.cursor; import android.database.sqlite.sqlitedatabase; import android.os.bundle; import android.view.menu; import android.widget.toast; import com.app.db.mysqliteopenhelper; public class main extends activity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); mysqliteopenhelper helper = new mysqliteopenhelper(this, "my.db3", null, 1); string insertsql = "insert into tb_test values(null,'wx',18)"; sqlitedatabase db = helper.getreadabledatabase(); db.execsql(insertsql); cursor cursor = db.rawquery("select * from tb_test", null); cursor.movetofirst(); int id = cursor.getint(0); toast.maketext(this, id+"",toast.length_short).show(); } @override public boolean oncreateoptionsmenu(menu menu) { getmenuinflater().inflate(r.menu.main, menu); return true; } }
实现效果:
上一篇: php中文字符串截取多种方法汇总
推荐阅读
-
实例讲解Android App使用自带的SQLite数据库的基本方法
-
Android App中使用LinearLayout进行居中布局的实例讲解
-
Android App中使用SurfaceView制作多线程动画的实例讲解
-
实例讲解Android中ContentProvider组件的使用方法
-
Android App在ViewPager中使用Fragment的实例讲解
-
Android App使用SQLite数据库的一些要点总结
-
Android App中使用LinearLayout进行居中布局的实例讲解
-
Android App在ViewPager中使用Fragment的实例讲解
-
Android App使用SQLite数据库的一些要点总结
-
实例讲解Android app开发中ListView的基本使用及优化