首页 > 代码库 > Android学习总结(十八) ———— SQLite数据库使用

Android学习总结(十八) ———— SQLite数据库使用

一、基本概念

  数据库最经典的四个操作 添加、删除、修改、查找,在处理大量数据的时候使用数据库可以帮我们迅速定位当前须要处理的数据,举个例子 好比现在要实现一个搜索功能 用数据库的话只须要其中一个搜索条件 一个数据库语句就可以迅速的在N条数据中找到我们需要的数据,如果不使用数据库那么查找起来会非常麻烦,效率大打折扣,所以在处理大量数据的时候使用数据库是明确的选择,在Android的开发中使用的数据库是SQLite ,它是一个轻量级的数据库、非常小、移植性好、效率高、可靠,嵌入式设备因为受到硬件条件的限制所以非常适合使用SQLite 数据库。

二、创建与删除数据库

  封装一个类去继承SQLiteOpenHelper  在构造函数中传入数据库名称与数据库版本号,数据库被创建的时候会调用onCreate(SQLiteDatabase db) 方法,数据库版本号发生改变的时候会调用onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法,可以方便的对软件游戏升级后做出相应处理避免覆盖安装数据库发生改变产生的错误。调用SQLiteOpenHelper  的getReadableDatabase()方法去创建数据库,如果数据库不存在则创建 并且返回SQLiteDatabase对象,如果数据库存在则不创建只返回SQLiteDatabase对象。调用deleteDatabase(DATABASE_NAME)方法 传入数据库名称则可删除数据库。

三、示例代码

  封装了一个DatabaseHelper类继承SQLiteOpenHelper 我使用了设计模式中的单例模式来处理这个类,这里说一下单例模式 单例模式是常见的代码设计模式之一 它的好处是在于避免在内存中频繁的实例化所以将它的对象写成static 静态 这样它的对象就只有一份存在静态内存区使用的时候只须要通过getInstance()就可以直接拿到这个静态对象。代码如下所示:

package com.nyl.sql;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * 建表
 */

public class DatabaseHelper extends SQLiteOpenHelper{

    private static DatabaseHelper databaseHelper = null;

    //数据库名称
    public static final String DATABASE_NAME = "nyl.db";

    //数据库版本号
    private static final int DATABASE_VERSION = 1;

    //数据库SQL语句,添加一个表
    private static final String NAME_TABLE_CREATE = "create table test("
    +"id integer primary key autoincrement,"
    +"name text,"
    +"hp integer default 100,"
    +"mp integer default 100,"
    +"number integer)";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);

    }

    //单例模式
    static synchronized DatabaseHelper getInstance(Context context){
        if (databaseHelper == null){
            databaseHelper = new DatabaseHelper(context);
        }
        return databaseHelper;
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //向数据中添加表
        sqLiteDatabase.execSQL(NAME_TABLE_CREATE);
    }

    //可以拿到当前数据库的版本信息,与之前数据库的版本信息,用于更新数据库
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    }


    /**
     * 删除数据库
     * @param context
     * @return
     */
    public boolean deleteDatabase(Context context) {
        return context.deleteDatabase(DATABASE_NAME);
    }
}

3.1 创建与删除数据库

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/new_sqlite"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btnCreateDateBase"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="创建数据库"/>

    <Button
        android:id="@+id/btnDeleteDateBase"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="删除数据库"/>

</LinearLayout>

  在这个类中使用DatabaseHelper对象 实现创建与删除数据库,代码如下所示:

package com.nyl.sql;

import android.app.Activity;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

/**
 * 创建与删除数据库
 */
public class NewSQLite extends Activity implements View.OnClickListener {

    private Button btnCreateDateBase;
    private Button btnDeleteDateBase;

    DatabaseHelper databaseHelper = null;
    SQLiteDatabase db = null;
    Context context = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.new_sqlite);
        context = this;
        initView(); //初始化布局控件
    }

    private void initView() {
        btnCreateDateBase = (Button) findViewById(R.id.btnCreateDateBase);
        btnDeleteDateBase = (Button) findViewById(R.id.btnDeleteDateBase);

        btnCreateDateBase.setOnClickListener(this);
        btnDeleteDateBase.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.btnCreateDateBase){
            //创建DatabaseHelper对象
            databaseHelper = DatabaseHelper.getInstance(context);
            //调用getReadableDatabase方法,如果数据库不存在则创建,如果存在则打开
            db = databaseHelper.getReadableDatabase();
            Toast.makeText(NewSQLite.this,"成功创建数据库",Toast.LENGTH_SHORT).show();
        }

        if (view.getId() == R.id.btnDeleteDateBase){
            //创建DatabaseHelper对象
            databaseHelper = DatabaseHelper.getInstance(context);
            //调用getReadableDatabase方法,如果数据库不存在则创建,如果存在则打开
            db = databaseHelper.getReadableDatabase();
            //关闭数据库
            databaseHelper.close();
            //删除数据库
            databaseHelper.deleteDatabase(context);
            Toast.makeText(NewSQLite.this,"成功删除数据库",Toast.LENGTH_SHORT).show();
        }
    }
}

  点击创建数据库按钮时,运行效果如下图:

  技术分享

  点击删除数据库按钮时,运行效果如下所示:

  技术分享

3.2 创建与删除数据库中的表

   布局代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/new_table"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btnCreateTable"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="在数据库中添加一个表"/>

    <Button
        android:id="@+id/btnDeleteTable"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="在数据库中删除一个表"/>

</LinearLayout>

  数据库是可以由多张数据表组成的 如果添加一张数据库的表的话 可以使用 数据库语句 create table 名称(内容) 来进行添加 。这里给出一条创建数据库的语句 。意思是创建一张表 名称为gameInfo 表中包含的字段 为id 为integer类型 并且递增  name 为Text类型 hp,mp为integer默认数值为100 number 为INTEGER 类型。代码如下所示:

package com.nyl.sql;

import android.app.Activity;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

/**
 * 创建与删除数据库中的表
 */
public class NewTable extends Activity implements View.OnClickListener {

    private Button btnCreateTable;
    private Button btnDeleteTable;

    DatabaseHelper dbHelper = null;
    SQLiteDatabase db = null;
    Context context = null;

    //创建一张表的SQL语句
    private static final String NAME_TABLE_CREATE = "create table gameInfo("
            +"id integer primary key autoincrement,"
            +"name text,"
            +"hp integer default 100,"
            +"mp integer default 100,"
            +"number integer)";

    //删除一张表的SQL语句
    private static final String NAME_TABLE_DELETE = "drop table gameInfo";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.new_table);
        context = this;

        //创建DatabaseHelper对象
        dbHelper = DatabaseHelper.getInstance(context);
        //调用getReadableDatabase方法,如果数据不存在则创建,如果存在则打开
        db = dbHelper.getReadableDatabase();

        initView(); //初始化布局控件

    }

    private void initView() {
        btnCreateTable = (Button) findViewById(R.id.btnCreateTable);
        btnDeleteTable = (Button) findViewById(R.id.btnDeleteTable);

        btnCreateTable.setOnClickListener(this);
        btnDeleteTable.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.btnCreateTable){
            db.execSQL(NAME_TABLE_CREATE);
            Toast.makeText(NewTable.this,"成功添加数据表",Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(NewTable.this,"数据库中已存此表",Toast.LENGTH_SHORT).show();
        }

        if (view.getId() == R.id.btnDeleteTable){
            db.execSQL(NAME_TABLE_DELETE);
            Toast.makeText(NewTable.this,"成功删除数据表",Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(NewTable.this,"数据库中已无此表",Toast.LENGTH_SHORT).show();
        }
    }
}

  点击在数据库中添加一个表按钮时,运行效果如下所示:

  技术分享

  当点击在数据库中删除一个表按钮时,运行效果如下:

  技术分享

3.3 增删改查数据库表中的数据

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/new_date"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btnAdd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="在表中添加一条数据"/>

    <Button
        android:id="@+id/btnDelete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="在表中删除一条数据"/>

    <Button
        android:id="@+id/btnModify"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="在表中修改一条数据"/>

    <Button
        android:id="@+id/btnFind"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="在表中查找一条数据"/>

</LinearLayout>

  使用SQLiteDatabase对象调用 insert()方法 传入标的名称与ContentValues 添加的内容 则可以向数据库表中写入一条数据 delete ()为删除一条数据 update()为更新一条数据。代码如下所示:

package com.nyl.sql;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

/**
 * 增删改查
 */
public class NewDate extends Activity implements View.OnClickListener {

    private Button btnAdd;
    private Button btnDelete;
    private Button btnModify;
    private Button btnFind;

    DatabaseHelper databaseHelper = null;
    SQLiteDatabase db = null;
    Context context = null;

    //数据库字段
    public final static String TABLE_NAME = "test";
    public final static String ID = "id";
    public final static String NAME = "name";
    public final static String HP = "hp";
    public final static String MP = "mp";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.new_date);
        context = this;
        //创建DatabaseHelper对象
        databaseHelper = DatabaseHelper.getInstance(context);
        //调用getReadableDatabase方法,如数据库不存在则创建,如果存在则打开
        db = databaseHelper.getReadableDatabase();
        initView();//初始化布局控件

        //给数据库表写入一些信息
        for (int i = 0; i<10; i++){
            insert(NAME,"农美眉" + i);
        }
    }

    private void initView() {
        btnAdd = (Button) findViewById(R.id.btnAdd);
        btnDelete = (Button) findViewById(R.id.btnDelete);
        btnModify = (Button) findViewById(R.id.btnModify);
        btnFind = (Button) findViewById(R.id.btnFind);

        btnAdd.setOnClickListener(this);
        btnDelete.setOnClickListener(this);
        btnModify.setOnClickListener(this);
        btnFind.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        //添加
        if (view.getId() == R.id.btnAdd){
            insert(NAME,"衣服");
            Toast.makeText(NewDate.this,"添加一条数据名称为衣服",Toast.LENGTH_SHORT).show();
        }
        //删除
        if (view.getId() == R.id.btnDelete){
            delete(ID,"1");
            Toast.makeText(NewDate.this,"删除一条id=1的数据",Toast.LENGTH_SHORT).show();
        }
        //修改
        if (view.getId() == R.id.btnModify){
            update(NAME,"连衣裙","漂亮");
            Toast.makeText(NewDate.this,"更新名称连衣裙为漂亮",Toast.LENGTH_SHORT).show();
        }
        //查找
        if (view.getId() == R.id.btnFind){
            Cursor cursor = find(ID,"3");
            String name = cursor.getString(cursor.getColumnIndex(NAME));
            Toast.makeText(NewDate.this,"查找ID为3数据的名称是" + name,Toast.LENGTH_SHORT).show();
        }
    }

    //插入一条数据
    public void insert(String name, String s) {
        ContentValues values = new ContentValues();
        values.put(name,s);
        db.insert(TABLE_NAME,null,values);
    }

    //删除一条数据
    public void delete(String id, String s) {
        db.delete(TABLE_NAME,id + "=?",new String[]{s});
    }

    //更新一条数据
    public void update(String key, String oldDate,String newDate) {
        ContentValues values = new ContentValues();
        values.put(key,newDate);
        db.update(TABLE_NAME,values,key+"=?",new String[]{oldDate});
    }

    //查找一条数据
    public Cursor find(String id, String s) {
        Cursor cursor = db.query(TABLE_NAME,null,id+"=?",new String[]{s},null,null,null);
        if (cursor != null){
            cursor.moveToFirst();
        }
        return cursor;
    }
}

  点击在表中添加一条数据按钮时,运行效果如下所示:

  技术分享

  点击在表中删除一条数据按钮时,运行效果如下所示:

  技术分享

  点击在表中修改一条数据按钮时,运行效果如下:

  技术分享

  点击在表中查找一条数据按钮时,运行效果如下:

  技术分享

  SQLite数据库使用我们就学到这里了,有什么不足的地方欢迎园友们提出宝贵意见,晚安!

Android学习总结(十八) ———— SQLite数据库使用