Android SQLite数据库基本操作方法

程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数据库来实现一些需求的吧,仍然以一个小例子开始:

在创建Android项目之前,我们应该想一下我们要定义的数据库的相关信息和里面的表格的相关信息,为了日后数据库的更新更加方便 ,我们可以用一个专门的类保存数据库的相关信息,以后如果要更新数据库的话只需要该动这个类就行了。这样使得日后的操作更加方便。

新建一个Android工程:

在Src文件夹下新建一个包com.example.databaseHelper:

在这个包中创建两个类,首先我们来看第一个类DatabaseStatic.Java:

package com.example.databaseHelper;

public class DatabaseStatic {

 public final static String DATABASE_NAME = "BookStore.db";
 public final static int DATABASE_VERSION = 1;

 public final static String TABLE_NAME = "book";
 public final static String BOOK_NAME = "bookName";
 public final static String ID = "_id";
 public final static String AUTHOR = "author";
 public final static String PRICE = "price";
 public final static String DATE = "sellData";
}

这个类中定义了数据库名称、版本、还有里面有一个名为“book”的表的相关信息,实现我们上面的意图,接下来是这个包里面的另外一个类MyHelper.java:

package com.example.databaseHelper;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;

/*
 * 在这个类的构造函数里面我们调用了父类的构造方法用来创建数据库文
 * 件,第二个构造方法只是为了方便构造(不用些那么多的参数)
 * 这个类继承了 SQLiteOpenHelper 类,并且重写了父类里面的
onCreate方法和 onUpgrade方法,
 * onCreate方法当数据库文件不存在的时候会被调用来创建一个新的数
 * 据库文件(不懂的小伙伴可以百度一下)
 */

public class MyHelper extends SQLiteOpenHelper{

 public static String CREATE_TABLE = "create table "+ DatabaseStatic.TABLE_NAME +"(" +
   DatabaseStatic.BOOK_NAME + " varchar(30), " +
   DatabaseStatic.ID + " Integer primary key autoincrement, " +
   DatabaseStatic.AUTHOR + " varchar(20) not null, " +
   DatabaseStatic.PRICE + " real)"; // 用于创建表的SQL语句
 private Context myContext = null;

 public MyHelper(Context context, String name,
   CursorFactory factory, int version) {
  super(context, DatabaseStatic.DATABASE_NAME, null, DatabaseStatic.DATABASE_VERSION);
 }

 public MyHelper(Context context)
 {
  super(context, DatabaseStatic.DATABASE_NAME, null, DatabaseStatic.DATABASE_VERSION);
  myContext = context;
 }

 @Override
 public void onCreate(SQLiteDatabase db) {
  Log.i("UseDatabase", "创建数据库");
  Toast.makeText(myContext, "创建数据库", Toast.LENGTH_SHORT).show();
  db.execSQL(CREATE_TABLE);
 }

 @Override
 public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {

 }
}

当要获取数据库对象时(通过SQLiteOPenHelper中自带的方法getWriteableDatabase或者getReadableDatabase),如果数据库文件不存在,这个类里面的onCreate方法会被调用来创建一个新的数据库文件,如果数据库文件已经存在,那么onCreate方法将不会被调用

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/mainLayout"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 android:gravity="center_horizontal"
 tools:context=".MainActivity" >

 <Button
  android:id="@+id/buttonCreateDatabase"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="创建数据库" />
 <Button
  android:id="@+id/buttonInsertDatabase"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="插入数据"/>
 <Button
  android:id="@+id/buttonUpdateDatabase"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="更新数据"/>
 <Button
  android:id="@+id/buttonDeleteDatabase"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="删除数据"/>
 <Button
  android:id="@+id/buttonQueryDatabase"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="显示数据库中 Book表中的所有数据"/>

</LinearLayout>

一段布局代码,主要是5个按钮对应5中对数据库的操作:创建数据库、插入数据、更新数据、删除数据、显示(查询)数据。
那么最后是MainActivity.java:

import com.example.databaseHelper.DatabaseStatic;
import com.example.databaseHelper.MyHelper;

import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

 private MyHelper myHelper = null;
 private Button button = null;
 private SQLiteDatabase database = null;
 private static int bookSum = 0;
 TextView textView = null;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  textView = new TextView(this);
  LinearLayout layout = (LinearLayout) findViewById(R.id.mainLayout);
  layout.addView(textView);
  button = (Button) findViewById(R.id.buttonCreateDatabase);
  button.setOnClickListener(listener);
  button = (Button) findViewById(R.id.buttonInsertDatabase);
  button.setOnClickListener(listener);
  button = (Button) findViewById(R.id.buttonUpdateDatabase);
  button.setOnClickListener(listener);
  button = (Button) findViewById(R.id.buttonDeleteDatabase);
  button.setOnClickListener(listener);
  button = (Button) findViewById(R.id.buttonQueryDatabase);
  button.setOnClickListener(listener);
 }

 private View.OnClickListener listener = new View.OnClickListener() {

  @Override
  public void onClick(View v) {
   switch(v.getId())
   {
   case R.id.buttonCreateDatabase:
    createDatabase();
    break;
   case R.id.buttonInsertDatabase:
    insertDatabase();
    break;
   case R.id.buttonUpdateDatabase:
    updateDatabase();
    break;
   case R.id.buttonDeleteDatabase:
    deleteDatabase();
    break;
   case R.id.buttonQueryDatabase:
    searchDatabase();
    break;
   }
  }
 };

 private void createDatabase() // 创建或者打开数据库
 {
  myHelper = new MyHelper(this); 

  /*
   * 调用getWritabelDatabase方法或者
   * getReadableDatabase方法时,如果数据库文
   * 件中不存在(注意一个数据库中可以存在多个表格),
   * 那么会回调MyHelper类的onCreate方法新建一个数据库文
   * 件并且在这个数据库文件中新建一
   * 个book表格
   */
  myHelper.getWritableDatabase();
 }

 private void insertDatabase() // 向数据库中插入新数据
 {
  if(myHelper == null)
  {
   myHelper = new MyHelper(this);
  }
  database = myHelper.getWritableDatabase();

  ContentValues cV = new ContentValues();
  cV.put(DatabaseStatic.BOOK_NAME, "C Language");
  cV.put(DatabaseStatic.ID, ++bookSum);
  cV.put(DatabaseStatic.AUTHOR, "zhidian");
  cV.put(DatabaseStatic.PRICE, 42.6);
  /*
   * 这个方法是留给不熟悉SQL语句的小伙伴用的,Android把
   * SQLite的插入语句封装了起来,
   * 通过 ContentValues 类的对象来保存数据库中的数据,
   * 于HashMap
   */
  database.insert(DatabaseStatic.TABLE_NAME, null, cV); 

  /*
   * 对应的SQL语句:
   * database.execSQL("insert into " + DatabaseStatic.TABLENAME + " values(?, ?, ?, ?)",
   * new Object[]{"C Language", ++bookSum, "zhidian", 42.6});
   * 或者是这个:
   * database.execSQL("insert into " + DatabaseStatic.TABLENAME + "(" +
   *  DatabaseStatic.BOOKNAME + ", " + DatabaseStatic.ID + ", " +
   *  DatabaseStatic.AUTHOR + ", " + DatabaseStatic.PRICE +
   *  ") values(?, ?, ?, ?)", new Object[]{"C Language", ++bookSum, "zhidian", 42.6});
   * 这里将 ? 号理解成一个C语言里面的占位符,然后通过 Object[] 数组中的内容补全,下同
   * 参数中的 Object[] 数组是一个通用的数组,里面的数据可以转换为任意类型的数据,通过这个完成不同数据类型变量之间的储存
  */

  Toast.makeText(this, "插入数据成功", Toast.LENGTH_SHORT).show();
 }

 private void updateDatabase() // 更新数据
 {
  if(myHelper == null)
  {
   myHelper = new MyHelper(this);
  }
  database = myHelper.getWritableDatabase();

  ContentValues cV = new ContentValues();
  cV.put(DatabaseStatic.AUTHOR, "xiaoming");
  /*
   * 调用 update 方法,将书名为"C Language" 的书作者更新为 "xiaoming
   */
  database.update(DatabaseStatic.TABLE_NAME, cV,
    DatabaseStatic.BOOK_NAME + "= ?", new String[]{"C Language"});
  /*
   * 对应的SQL语句:
   * database.execSQL("update " + DatabaseStatic.TABLENAME + " set " + DatabaseStatic.AUTHOR +
   *  "= ? where " + DatabaseStatic.BOOKNAME + " = ?", new String[]{"xiaoming", "C Language"});
   */

  Toast.makeText(this, "数据更新成功", Toast.LENGTH_SHORT).show();
 }

 private void deleteDatabase() // 数据库中删除数据
 {
  if(myHelper == null)
  {
   myHelper = new MyHelper(this);
  }
  database = myHelper.getWritableDatabase();

  /*
   * 调用 delete 方法删除数据库中的数据
   * 对应的SQL语句:
   * database.execSQL("delete from " +
   * DatabaseStatic.TABLE_NAME + " where " +
   * DatabaseStatic.BOOK_NAME + " = ?", new
   * String[]{"C Language"});
   */
  database.delete(DatabaseStatic.TABLE_NAME, DatabaseStatic.BOOK_NAME + " = ? ",
    new String[]{"C Language"});

  Toast.makeText(this, "数据删除成功", Toast.LENGTH_SHORT).show();
 }

 private void searchDatabase() // 查询数据库中的数据
 {
  if(myHelper == null)
  {
   myHelper = new MyHelper(this);
  }
  database = myHelper.getWritableDatabase();
  /*
   * 调用database的query方法,第一个参数是要查询的表名,
   * 后面的参数是一些查询的约束条件,对应于SQL语句的一些参
   * 数, 这里全为null代表查询表格中所有的数据
   * 查询的结果返回一个 Cursor对象
   * 对应的SQL语句:
   * Cursor cursor = database.rawQuery("select * from book", null);
   */
  Cursor cursor = database.query(DatabaseStatic.TABLE_NAME, null, null, null, null, null, null);

  StringBuilder str = new StringBuilder();
  if(cursor.moveToFirst()) // 显示数据库的内容
  {
   for(; !cursor.isAfterLast(); cursor.moveToNext()) // 获取查询游标中的数据
   {
    str.append(cursor.getString(cursor.getColumnIndex(DatabaseStatic.ID)) + " ");
    str.append(cursor.getString(cursor.getColumnIndex(DatabaseStatic.BOOK_NAME)) + " ");
    str.append(cursor.getString(cursor.getColumnIndex(DatabaseStatic.AUTHOR)) + " ");
    str.append(cursor.getString(cursor.getColumnIndex(DatabaseStatic.PRICE)) + "\n");
   }
  }
  cursor.close(); // 记得关闭游标对象
  if(str.toString().equals(""))
  {
   str.append("数据库为空!");
   textView.setTextColor(Color.RED);
  }
  else
  {
   textView.setTextColor(Color.BLACK);
  }
  textView.setText(str.toString());
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }
}

MainActivity.java里面主要是实现了5个按钮对应的操作

SQLiteDatabase 类里面提供了对数据库表格进行插入、更新、删除、查询 的对应API,用于给对SQL语句不熟悉的开发者使用,当然我们还可以调用这个类里面的 execSQL 方法来直接执行SQL语句中的插入、更改、删除操作,用rawQuery 方法来执行SQL语句的查询语句。

Ok,整个工程的项目视图(可能有些多余。。。):

好了,运行一下:

先点击“创建数据库”按钮:

程序中的数据库文件都储存在 /data/data/<包名>/databases文件中

运行cmd(windows系统)运行abd调试工具(如果没有将adb.exe加入环境变量中则需要写出adb.exe的完整路径)

输入 adb shell

再输入 cd /data/data/com.example.UseDataBase/databases进入对应储存文件目录

再输入 ls 显示文件中的子文件目录,接下来我们就可以对数据库文件进行操作了:

输入 sqlite3 数据库名称, 就可以对数据库进行操作了:

输入 .table 来查看当前数据库文件中的表格目录, 结果如下:

我们可以看到我们要创建的表格确实存在,证明我们的代码确实创建了数据库文件和里面对应的表。

而我们注意到这里面还有另外一个android_metadata表,这个表是每个数据库文件都会自动生成的,不需要管。

接下来单击“插入数据”按钮:

之后 在控制台中输入 “select * from book;”,这个是查询数据库文件中的数据的SQL语句,不熟悉的小伙伴可以在网上查到一些教程

我们可以看到我们确实在book这张表中成功的插入了一条新的数据。

接下来单击“更新数据”按钮:

Ok,确实把书名为“C Language”的书的作者改为了 “xiaowei”,继续单击“删除”按钮:

使用 “select * from”语句查询表中的所有数据,并没有看到有数据,我们再单击一下“显示数据库中book表中的所有数据”按钮:

这样看来,数据库中book表中的数据确实已经被我们删除了。

这里提一下SQLite数据库操作的时候主要用到的数据类型:
整形:Integer、字符数组:varchar(10)、浮点数:real、字符串文本:text。当然SQLite还有很多的操作和支持的数据类型。

最后给出一些常用的SQL语句:

1、创建数据库表:

create table 表名(参数1 数据类型 约数条件, 参数2 数据类型 约束条件…) 

例:

代码如下:

create table person(_id Integer primary key autoincrement, name varchar(20), sex varchar(5) not null, age Integer)

2、插入数据:

insert into 表名(参数1, 参数2…) values(参数1的值, 参数2的值…)

或者:

insert into 表名 values(参数1的值, 参数2的值)

例:

insert into person(_id, name, sex, age) values(1, “指点”, “男”, 19)
insert into person values(1, “指点”, “男”, 19)

3、更新数据:

update 表名 set 参数1 = 值, 参数2 = 值… where 条件1 and 条件2 or 条件3… 

更新符合条件的所有数据

where后面的条件用 “and” 或者 “or”连接

例:

代码如下:

update person set _id = 0, age = 18 where _id = 1 and age<>19 // “<>”符号代表“不等于”

4、删除数据:

delete from 表名 where 条件1 and 条件2 or 条件3… 

删除符合条件的所有数据

例:

delete from person where _id > 0 and name = “指点”

前四个操作的SQL语句可用 execSQL 方法带入参数执行

5、查询数据:

select 参数1, 参数2… from 表名 where 条件1 and 条件2… 

返回的是符合条件的所有的数据中的参数1、参数2…

例:

select _id, name, sex from person where name = “指点” or _id = 1 

返回的是: 1、“指点”、“男”

注意查询操作的SQL语句要用 rawQuery方法执行,详见代码

Ok, 终于把SQLite 的基础操作总结完了。这里所说的只是SQLite操作的冰山一角,日后还得多多学习。

(0)

相关推荐

  • Android使用SQLite数据库的示例

    一. 简介 SQLite数据库是一个轻量级的DBMS(数据库管理系统).SQLite使用单个文件存储数据,Android标准库包含SQLite库以及配套使用的一些Java辅助类.主要特点:轻量级,单一文件,跨平台,开源. 二. Android中SQLite数据库的使用 1.创建SQLite数据库 SQLiteDatabase db= SQLiteDatabase.openOrCreateDatabase( "/data/data/" + getPackageName() + "

  • Android SQLite事务处理结合Listview列表显示功能示例

    本文实例讲述了Android SQLite事务处理结合Listview列表显示功能.分享给大家供大家参考,具体如下: 前面的文章里介绍过事务的特点如原子性,隔离性,一致性,持久性.下面就结合Android的sqlite来说下,这次的文章里会把listview也结合起来用.实际上android里的事务和我们数据库里的是一样的.也是开启事务,操作,提交事务.如果出现问题就回滚. public void Transaction(){ SQLiteDatabase database=db.getRead

  • Android利用listview控件操作SQLite数据库实例

    在本实例中,首先我们利用SQLiteOpenHelper类建立一个数据库,并写好增.删.查等方法,通过SimpleCursorAdapter连接listview实现数据库的增加.查询以及长按删除的功能. 首先,我们先认识一下什么是SQLiteOpenHelper类. Android为了操作SQlite数据库,提供了SQLiteDatabase类,其内封装了insert .delete.update .query .执行SQL命令等操作.同时又为SQLiteDatabase提供了一个辅助类,SQL

  • Android编程之SQLite数据库操作方法详解

    本文实例讲述了Android SQLite数据库操作方法.分享给大家供大家参考,具体如下: SQLite and Android SQLite简介 SQLite是一个非常流行的嵌入式数据库,它支持SQL语言,并且只利用很少的内存就有很好的性能.此外,它还是开源的,任何人都可以使用它. SQLite由以下几个组件组成:SQL编译器.内核.后端以及附件.SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),使调试.修改和扩展SQLite的内核变得更加方便. SQLite支持的数据类型包括: 1.

  • Android批量插入数据到SQLite数据库的方法

    Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知.因此在Android中插入数据时,使用批量插入的方式可以大大提高插入速度. 有时需要把一些数据内置到应用中,常用的有以下几种方式: 1.使用db.execSQL(sql) 这里是把要插入的数据拼接成可执行的sql语句,然后调用db.execSQL(sql)方法执行插入. public void inertOrUpdateDateBatch(List<

  • Android SQLite数据库版本升级的管理实现

    Android SQLite数据库版本升级的管理实现 我们知道在SQLiteOpenHelper的构造方法: super(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 中最后一个参数表示数据库的版本号.当新的版本号大于当前的version时会调用方法: onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 所以我们

  • Android开发笔记SQLite优化记住密码功能

    本文实例为大家分享了Android SQLite优化记住密码功能的具体代码,供大家参考,具体内容如下 package com.example.alimjan.hello_world; /** * Created by alimjan on 7/4/2017. */ import com.example.alimjan.hello_world.bean.UserInfo; import com.example.alimjan.hello_world.dataBase.UserDBHelper; i

  • android SQLite数据库总结

    SQLite SQLite是一种超轻量级的嵌入式数据库,大小只有几百KB,但是其语法支持标准SQL语法,同时还遵循了数据库的ACID事务,所以学过其他数据库的开发人员都很容易掌握其使用. sql语法就不介绍了,直接看在android中的使用 SQLiteOpenHelper--封装好的数据库操作辅助类,需重写 重写方法 onCreate:初始化数据库,创建表,添加初始数据 onUpgrade:数据库版本升级时的数据库操作,如备份删除数据库等 常用方法 getReadableDatabase() 

  • Android SQLite数据库基本操作方法

    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能.而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库.那么就来看一下在Android程序中怎么去操作SQLite数据库来实现一些需求的吧,仍然以一个小例子开始: 在创建Android项目之前,我们应该想一下我们要定义的数据库的相关信息和里面的表格的相关信息,为了日后数据库的更新更加方便 ,我们可以用一个专门的类保存数据库的相关信息,以后如果要更新数据库的话只需要该动这个类

  • Android SQLite数据库加密的操作方法

    一.前言 SQLite是一个轻量级的.跨平台的.开源的嵌入式数据库引擎,也是一个关系型的的使用SQL语句的数据库引擎, 读写效率高.资源消耗总量少.延迟时间少,使其成为移动平台数据库的最佳解决方案(如Android.iOS) 但是Android上自带的SQLite数据库是没有实现加密的,我们可以通过Android Studio直接导出应用创建的数据库文件,然后通过如SQLite Expere Personal 这种可视化工具打开数据库文件进行查看数据库的表结构,以及数据,这就导致存储在SQLit

  • Android SQLite数据库中的表详解

    Android SQLite数据库 前言 以前写PHP的时候,内置了print_r()和var_dump()两个函数用于打印输出任意类型的数据内部结构,现在做Android的开发,发现并没有这种类似的函数,对于数据库的查看很不方便,于是就写了一下查看数据库表的方法代码. 代码实现 import java.util.Arrays; import android.app.Activity; import android.database.Cursor; import android.database

  • Android SQLite数据库的增 删 查找操作

    在Android开发中,有时我们需要对SQLite数据库进行增,删,查,找等操作,现在就来简单介绍一下,以下为详细代码. 一.创建一个自定义数据库 二.创建一个自定义适配器 三.编写MainActivity代码 以上所述是小编给大家介绍的Android SQLite数据库的增 删 查找操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.在此也非常感谢大家对我们网站的支持!

  • Android+SQLite数据库实现的生词记事本功能实例

    本文实例讲述了Android+SQLite数据库实现的生词记事本功能.分享给大家供大家参考,具体如下: 主activity命名为 Dict: 代码如下: package example.com.myapplication; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase;

  • Android SQLite数据库增删改查操作的使用详解

    一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NULL.INTEGER.REAL(浮点数字). TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n). char(n).decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型. SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段

  • Android SQLite数据库彻底掌握数据存储

    SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么. 例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值. 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误. 另外, SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息,如下面语句

  • Android  SQLite数据库彻底掌握数据存储

    SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么. 例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值. 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误. 另外, SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息,如下面语句

随机推荐