欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

实例讲解Android App使用自带的SQLite数据库的基本方法

程序员文章站 2024-03-01 13:38:10
sqlite数据库是android系统内嵌的数据库,小巧强大,能够满足大多数sql语句的处理工作,而sqlite数据库仅仅是个文件而已。虽然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();
    }
  }
 
}

实现的效果:

实例讲解Android App使用自带的SQLite数据库的基本方法

需要特别指出,在用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;
  }
 
}

实现效果:

实例讲解Android App使用自带的SQLite数据库的基本方法