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

实例讲解Android中SQLiteDatabase使用方法

程序员文章站 2024-03-01 16:30:58
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);

通过这些静态方法可以很方便的打开和新建一个数据库。

1、execsql(string sql,object[] bindargs)

2、execsql(string sql)

3、rawquery(string sql,string[] selectionargs);

4、begintransaction()

5、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中SQLiteDatabase使用方法

需要特别指出,在用simplecursoradapter封装cursor的时候,要求底层数据库表的主键列的列名为_id,因为simplecursoradapter只能识别主键列名为_id的表。

以上就是本文的全部内容,希望能给大家一个参考,也希望大家多多支持。