当前位置: 移动技术网 > 移动技术>移动开发>Android > 实例讲解Android App使用自带的SQLite数据库的基本方法

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

2019年07月24日  | 移动技术网移动技术  | 我要评论

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();
    }
  }
 
}

实现的效果:

2016419174304714.png (720×1280)

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

实现效果:

2016419174411822.png (720×1280)

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网