您的位置:首页 > 移动开发 > Android开发

学习笔记:Android SQLite,并实现SQLite基本CRUD操作的Demo

2016-12-25 17:50 495 查看
转载地址:http://blog.csdn.net/jinxin_cuit/article/details/52608732

目录(?)[-]

一背景
二具体情形

创建数据库
升级数据库
添加数据
函数原型inserttableName null ContentValues values
更新数据
函数原型updatetableName ContentValues values String arg3 String arg4
删除数据
查询数据

三参考代码
四Demo演示

一、背景

Android系统内置有SQLite,用户可以在本地存放大量较为复杂的关系型数据,相较于File操作和SharedPreferences只能存放简单的数据,SQLite具有更大的优势。

Android的SQLite使用有两种方式:一是直接使用Android 为SQLite封装好的API函数insert/delete/update/query;二是使用原生的SQLite语句。

二、具体情形

1.创建数据库

Android提供了一个叫SQLiteOpenHelper的抽象类,用来创建和升级数据库,其中包含两个抽象方法onCreate()和onUpgrade(),意味着我们在自定义MySQLiteOpenHelper类的时候必须去复写这两个方法,同时还必须复写构造函数。

另外,该类还包括getReadableDatabase()和getWritableDatabase(),两者都可以创建或者打开一个数据库,并返回一个具有可读可写权限的SQLiteDatabase对象。唯一区别在于:当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。

当调用SQLiteOpenHelper实例的getReadableDatabase()或者getWritableDatabase()方法时,如果之前没有改数据库,则会首先调用SQLiteOpenHelper实例的复写的onCreate方法去创建一个数据库(表),然后打开并返回创建好的该数据库,执行后续操作。

SQLiteOpenHelper需要复写的函数:

1)构造函数:public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version),四个参数依次为Context实例,要创建的数据库名称,null,当前数据库版本;

2)数据库创建函数:public void onCreate(SQLiteDatabase db),参数是要创建的数据库

3)数据库升级函数:public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),参数分别是要升级的数据库,上一版本,最新版本。当调用构造函数MyDatabaseHelper时,version号大于之前的version号,该函数将被调用

2.升级数据库

比如说,我们需要在当前数据库的基础上新增或者删除一个表,而不需要在构造函数MyDatabaseHelper()当中的参数version传入大于上一次的版本号,那么则会调用onUpgrade()函数,在该函数里面去实现升级的操作。

至此,我们已经学会创建和升级数据库,接着要做的事情就是对该空白的数据库进行增删改查CRUD

3.添加数据:

函数原型:insert("tableName", null, ContentValues values)

参数:第一个是表名,第三个是ContenValues对象

给数据库插入数据时,我们需要创建一个ContenValues的对象,然后把要增加的数据以键值对的形式载入到values,然后通过insert()方法来实现添加数据。

4.更新数据:

函数原型:update("tableName", ContentValues values, String arg3, String arg4)

参数: 第一个是表名,第二个是ContenValues对象,第三和第四个参数是限定条件,更新哪些行数据

数据库更新数据时,我们也需要创建一个ContenValues的对象,然后把要增加的数据以键值对的形式载入到values,同时结合限定条件,确定要更新的数据行,然后通过update()方法来实现更新数据。

5.删除数据

函数原型:delete("tableName", String arg2, String arg3)
参数:第一个是表名,第二个和第三个是限定条件,确定删除哪些行数据。

删除数据库数据时,我们只需要表名和要输出的数据行限定条件就OK。

6.查询数据

查询表中全部数据:query("tableName", null, null, null, null, null, null)
参数:第一个是表名,其他六个参数填null,表示查询表中全部数据
返回值:Cursor对象
利用cursor.moveToFirst()移动表的第一个数据位置;利用cursor.moveToNext()函数去遍历下一行数据。最后需要关闭cursor.close()。

三、参考代码

MySQLiteOpenHelper:去继承SQLiteOpenHelper,并复写构造函数、onCreate()、onUpgrade(),实现数据库的创建和升级

[java] view
plain copy

package com.steven.mydatabasetest;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.widget.Toast;

/**

* Created by Steven on 2016/9/20.

*/

public class MySQLiteOpenHelper extends SQLiteOpenHelper {

//定义一个创建表Book的SQLite语句

private static final String CREATE_BOOK = "create table Book("

+ "id integer primary key autoincrement, "

+ "author text,"

+ "price real, "

+ "pages integer, "

+ "name text)";

//定义一个创建表Category的SQLite语句

private static final String CREATE_CATEGORY = "create table Category("

+ "id integer primary key autoincrement, "

+ "category_name text, "

+ "category_code integer)";

private Context mContext;

public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {

super(context, name, factory, version);

mContext = context; //获取Context实例

}

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL(CREATE_BOOK);

db.execSQL(CREATE_CATEGORY);

Toast.makeText(mContext, "成功创建Database", Toast.LENGTH_SHORT).show();

}

@Override

public void onUpgrade(SQLiteDatabase db, int i, int i1) {

db.execSQL("drop table if exists Book"); //如果存在表Book,则删除该表

db.execSQL("drop table if exists Category"); //如果存在表Category,则删除该表

onCreate(db); //重新调用onCreate(),创建两张表

}

}

MainActivity:创建数据库,并且实现对数据库的相关操作CRUD

[java] view
plain copy

package com.steven.mydatabasetest;

import android.content.ContentValues;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

private Button btnCreateDatabase;

private Button btnInsertData;

private Button btnUpdateData;

private Button btnDeleteData;

private Button btnQueryData;

private MySQLiteOpenHelper dbHelper;

private static final String TAG = "Steven";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//调用构造函数,指明要创建的数据库名字以及版本号

dbHelper = new MySQLiteOpenHelper(MainActivity.this,"BookStore.db", null, 5);

//1.创建数据库

btnCreateDatabase = (Button)findViewById(R.id.btn_create_database);

btnCreateDatabase.setOnClickListener(this);

//2.插入数据

btnInsertData = (Button)findViewById(R.id.btn_insert_data);

btnInsertData.setOnClickListener(this);

//3.修改数据

btnUpdateData = (Button)findViewById(R.id.btn_update_data);

btnUpdateData.setOnClickListener(this);

//4.删除数据

btnDeleteData = (Button)findViewById(R.id.btn_delete_data);

btnDeleteData.setOnClickListener(this);

//5.查询数据

btnQueryData = (Button)findViewById(R.id.btn_query_data);

btnQueryData.setOnClickListener(this);

}

@Override

public void onClick(View view) {

switch (view.getId()){

// 1.创建并打开数据库BookStore.db,回调MySQLiteOpenHelper类中的onCreate()方法创建表

case R.id.btn_create_database:

dbHelper.getWritableDatabase();

break;

// 2.向表中插入数据: insert

case R.id.btn_insert_data:

SQLiteDatabase db = dbHelper.getWritableDatabase(); //获取返回的SQLiteDatabase对象

ContentValues contentValues = new ContentValues();

//组装数据

contentValues.put("name","第一行代码");

contentValues.put("author","郭霖");

contentValues.put("pages", 552);

contentValues.put("price",79.0);

db.insert("Book", null, contentValues); //向表Book中插入一条数据

contentValues.clear();

//组装数据

contentValues.put("name","第二行代码");

contentValues.put("author","郭霖");

contentValues.put("pages", 662);

contentValues.put("price",89.0);

db.insert("Book", null, contentValues); //向表Book中插入第二条数据

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

break;

// 3.修改数据: update

case R.id.btn_update_data:

SQLiteDatabase db1 = dbHelper.getWritableDatabase();

ContentValues contentValues1 = new ContentValues();

contentValues1.put("name", "第三行代码");

db1.update("Book", contentValues1,"name = ?",new String[]{"第二行代码"});

Toast.makeText(this, "成功修改数据", Toast.LENGTH_SHORT).show();

break;

// 4.删除数据:delete

case R.id.btn_delete_data:

SQLiteDatabase db2 = dbHelper.getWritableDatabase();

db2.delete("Book", "pages > ?", new String[]{"600"});

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

break;

// 5.查询数据: query

case R.id.btn_query_data:

SQLiteDatabase db3 = dbHelper.getWritableDatabase();

Cursor cursor = db3.query("Book", null, null, null, null, null, null);

//查询表中所有数据

if(cursor.moveToFirst()){

//遍历Cursor对象,取出数据

do{

String name = cursor.getString(cursor.getColumnIndex("name"));

String author = cursor.getString(cursor.getColumnIndex("author"));

int pages = cursor.getInt(cursor.getColumnIndex("pages"));

double price = cursor.getDouble(cursor.getColumnIndex("price"));

Log.d(TAG,"Book name: " + name);

Log.d(TAG,"Book author: " + author);

Log.d(TAG,"Book pages: " + pages);

Log.d(TAG,"Book price: " + price);

}while(cursor.moveToNext());

cursor.close();

}

Toast.makeText(this, "查询出表中全部数据", Toast.LENGTH_SHORT).show();

break;

default:

break;

}

}

}

四、Demo演示



目录(?)[-]

一背景
二具体情形

创建数据库
升级数据库
添加数据
函数原型inserttableName null ContentValues values
更新数据
函数原型updatetableName ContentValues values String arg3 String arg4
删除数据
查询数据

三参考代码
四Demo演示

一、背景

Android系统内置有SQLite,用户可以在本地存放大量较为复杂的关系型数据,相较于File操作和SharedPreferences只能存放简单的数据,SQLite具有更大的优势。

Android的SQLite使用有两种方式:一是直接使用Android 为SQLite封装好的API函数insert/delete/update/query;二是使用原生的SQLite语句。

二、具体情形

1.创建数据库

Android提供了一个叫SQLiteOpenHelper的抽象类,用来创建和升级数据库,其中包含两个抽象方法onCreate()和onUpgrade(),意味着我们在自定义MySQLiteOpenHelper类的时候必须去复写这两个方法,同时还必须复写构造函数。

另外,该类还包括getReadableDatabase()和getWritableDatabase(),两者都可以创建或者打开一个数据库,并返回一个具有可读可写权限的SQLiteDatabase对象。唯一区别在于:当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。

当调用SQLiteOpenHelper实例的getReadableDatabase()或者getWritableDatabase()方法时,如果之前没有改数据库,则会首先调用SQLiteOpenHelper实例的复写的onCreate方法去创建一个数据库(表),然后打开并返回创建好的该数据库,执行后续操作。

SQLiteOpenHelper需要复写的函数:

1)构造函数:public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version),四个参数依次为Context实例,要创建的数据库名称,null,当前数据库版本;

2)数据库创建函数:public void onCreate(SQLiteDatabase db),参数是要创建的数据库

3)数据库升级函数:public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),参数分别是要升级的数据库,上一版本,最新版本。当调用构造函数MyDatabaseHelper时,version号大于之前的version号,该函数将被调用

2.升级数据库

比如说,我们需要在当前数据库的基础上新增或者删除一个表,而不需要在构造函数MyDatabaseHelper()当中的参数version传入大于上一次的版本号,那么则会调用onUpgrade()函数,在该函数里面去实现升级的操作。

至此,我们已经学会创建和升级数据库,接着要做的事情就是对该空白的数据库进行增删改查CRUD

3.添加数据:

函数原型:insert("tableName", null, ContentValues values)

参数:第一个是表名,第三个是ContenValues对象

给数据库插入数据时,我们需要创建一个ContenValues的对象,然后把要增加的数据以键值对的形式载入到values,然后通过insert()方法来实现添加数据。

4.更新数据:

函数原型:update("tableName", ContentValues values, String arg3, String arg4)

参数: 第一个是表名,第二个是ContenValues对象,第三和第四个参数是限定条件,更新哪些行数据

数据库更新数据时,我们也需要创建一个ContenValues的对象,然后把要增加的数据以键值对的形式载入到values,同时结合限定条件,确定要更新的数据行,然后通过update()方法来实现更新数据。

5.删除数据

函数原型:delete("tableName", String arg2, String arg3)
参数:第一个是表名,第二个和第三个是限定条件,确定删除哪些行数据。

删除数据库数据时,我们只需要表名和要输出的数据行限定条件就OK。

6.查询数据

查询表中全部数据:query("tableName", null, null, null, null, null, null)
参数:第一个是表名,其他六个参数填null,表示查询表中全部数据
返回值:Cursor对象
利用cursor.moveToFirst()移动表的第一个数据位置;利用cursor.moveToNext()函数去遍历下一行数据。最后需要关闭cursor.close()。

三、参考代码

MySQLiteOpenHelper:去继承SQLiteOpenHelper,并复写构造函数、onCreate()、onUpgrade(),实现数据库的创建和升级

[java] view
plain copy

package com.steven.mydatabasetest;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.widget.Toast;

/**

* Created by Steven on 2016/9/20.

*/

public class MySQLiteOpenHelper extends SQLiteOpenHelper {

//定义一个创建表Book的SQLite语句

private static final String CREATE_BOOK = "create table Book("

+ "id integer primary key autoincrement, "

+ "author text,"

+ "price real, "

+ "pages integer, "

+ "name text)";

//定义一个创建表Category的SQLite语句

private static final String CREATE_CATEGORY = "create table Category("

+ "id integer primary key autoincrement, "

+ "category_name text, "

+ "category_code integer)";

private Context mContext;

public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {

super(context, name, factory, version);

mContext = context; //获取Context实例

}

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL(CREATE_BOOK);

db.execSQL(CREATE_CATEGORY);

Toast.makeText(mContext, "成功创建Database", Toast.LENGTH_SHORT).show();

}

@Override

public void onUpgrade(SQLiteDatabase db, int i, int i1) {

db.execSQL("drop table if exists Book"); //如果存在表Book,则删除该表

db.execSQL("drop table if exists Category"); //如果存在表Category,则删除该表

onCreate(db); //重新调用onCreate(),创建两张表

}

}

MainActivity:创建数据库,并且实现对数据库的相关操作CRUD

[java] view
plain copy

package com.steven.mydatabasetest;

import android.content.ContentValues;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

private Button btnCreateDatabase;

private Button btnInsertData;

private Button btnUpdateData;

private Button btnDeleteData;

private Button btnQueryData;

private MySQLiteOpenHelper dbHelper;

private static final String TAG = "Steven";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//调用构造函数,指明要创建的数据库名字以及版本号

dbHelper = new MySQLiteOpenHelper(MainActivity.this,"BookStore.db", null, 5);

//1.创建数据库

btnCreateDatabase = (Button)findViewById(R.id.btn_create_database);

btnCreateDatabase.setOnClickListener(this);

//2.插入数据

btnInsertData = (Button)findViewById(R.id.btn_insert_data);

btnInsertData.setOnClickListener(this);

//3.修改数据

btnUpdateData = (Button)findViewById(R.id.btn_update_data);

btnUpdateData.setOnClickListener(this);

//4.删除数据

btnDeleteData = (Button)findViewById(R.id.btn_delete_data);

btnDeleteData.setOnClickListener(this);

//5.查询数据

btnQueryData = (Button)findViewById(R.id.btn_query_data);

btnQueryData.setOnClickListener(this);

}

@Override

public void onClick(View view) {

switch (view.getId()){

// 1.创建并打开数据库BookStore.db,回调MySQLiteOpenHelper类中的onCreate()方法创建表

case R.id.btn_create_database:

dbHelper.getWritableDatabase();

break;

// 2.向表中插入数据: insert

case R.id.btn_insert_data:

SQLiteDatabase db = dbHelper.getWritableDatabase(); //获取返回的SQLiteDatabase对象

ContentValues contentValues = new ContentValues();

//组装数据

contentValues.put("name","第一行代码");

contentValues.put("author","郭霖");

contentValues.put("pages", 552);

contentValues.put("price",79.0);

db.insert("Book", null, contentValues); //向表Book中插入一条数据

contentValues.clear();

//组装数据

contentValues.put("name","第二行代码");

contentValues.put("author","郭霖");

contentValues.put("pages", 662);

contentValues.put("price",89.0);

db.insert("Book", null, contentValues); //向表Book中插入第二条数据

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

break;

// 3.修改数据: update

case R.id.btn_update_data:

SQLiteDatabase db1 = dbHelper.getWritableDatabase();

ContentValues contentValues1 = new ContentValues();

contentValues1.put("name", "第三行代码");

db1.update("Book", contentValues1,"name = ?",new String[]{"第二行代码"});

Toast.makeText(this, "成功修改数据", Toast.LENGTH_SHORT).show();

break;

// 4.删除数据:delete

case R.id.btn_delete_data:

SQLiteDatabase db2 = dbHelper.getWritableDatabase();

db2.delete("Book", "pages > ?", new String[]{"600"});

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

break;

// 5.查询数据: query

case R.id.btn_query_data:

SQLiteDatabase db3 = dbHelper.getWritableDatabase();

Cursor cursor = db3.query("Book", null, null, null, null, null, null);

//查询表中所有数据

if(cursor.moveToFirst()){

//遍历Cursor对象,取出数据

do{

String name = cursor.getString(cursor.getColumnIndex("name"));

String author = cursor.getString(cursor.getColumnIndex("author"));

int pages = cursor.getInt(cursor.getColumnIndex("pages"));

double price = cursor.getDouble(cursor.getColumnIndex("price"));

Log.d(TAG,"Book name: " + name);

Log.d(TAG,"Book author: " + author);

Log.d(TAG,"Book pages: " + pages);

Log.d(TAG,"Book price: " + price);

}while(cursor.moveToNext());

cursor.close();

}

Toast.makeText(this, "查询出表中全部数据", Toast.LENGTH_SHORT).show();

break;

default:

break;

}

}

}

四、Demo演示

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android sqlite