Android SQLite数据库基本操作方法
作者:指点 发布时间:2022-07-09 18:31:20
程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,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操作的冰山一角,日后还得多多学习。
来源:http://blog.csdn.net/hacker_zhidian/article/details/54973344


猜你喜欢
- @FeignClient()注解的使用由于SpringCloud采用分布式微服务架构,难免在各个子模块下存在模块方法互相调用的情况。比如se
- 本文实例为大家分享了Android自动播放Banner图片轮播的具体代码,供大家参考,具体内容如下先看一下效果图支持本地图片以及网络图片or
- Equals和GetHashCodeEquals每个实现都必须遵循以下约定:自反性(Reflexive): x.equals(x)必须返回t
- 前言在Mac中用android studio 导出jar包最重要的是需要配置gradle ,它包的导出也是通过gradle命令进行的。所以,
- 当前,JVM生态圈主要的三大构建工具:Apache Ant(带着Ivy)MavenGradle对于初学者,Ant是最清晰的,只要读懂Xml配
- 简介本文介绍InheritableThreadLocal的用法。ThreadLocal可以将数据绑定当前线程,如果希望当前线程的Thread
- 消息队列1.消息队列的原理1.1 msgqueue采用链表来实现消息队列, 该链表是由系统内核维护,1.2 系统中可能有很多的msgqueu
- 一、简介本文主要介绍jmeter在控制台在点击执行之后底层所做的一些主要事情及内容,由于便于断点调试采用GUI方式进行操作二、配置简介为了调
- 简介现在市面上的apk只要涉及用户中心都会有头像,而且这个头像也是可自定义的,有的会采取读取相册选择其中一张作为需求照片,另一种就是调用系统
- 开发中需要传递变参,考虑使用 dynamic 还是 Dictionary(准确地说是Dictionary<string,object&
- 最近的项目,做图片的另存为功能,需要把图片存成jpg,png,bmp。对于jpg和png来说相对简单,android提供了bitmap.co
- 这篇文章主要介绍了JavaWeb如何实现禁用浏览器缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 本文实例实现文件上传的进度显示,我们先看看都有哪些问题我们要解决。1 上传数据的处理进度跟踪2 进度数据在用户页面的显示就这么2个问题,第一
- 本文实例为大家分享了Android实现京东首页效果的具体代码,供大家参考,具体内容如下1.效果图:2.布局源码链接<?xml vers
- 任务循环数组实现目标:(1)创建一个新的数组数据结构;(2)该数据结构为泛型;(3)可以按照元素多少进行扩容缩容;(4)进行添加删除操作的时
- 应用场景最近社区总有人发文章带上小广告,严重影响社区氛围,好气!对于这种类型的用户,就该永久拉黑!社区的安全框架使用了 spring-sec
- 环境:Spring5.3.12.RELEASE。Spring 3引入了一个core.onvert包,提供一个通用类型转换系统。系统定义了一个
- 这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适
- 本文实例讲述了C#中Winform窗体Form的关闭按钮变灰色的方法,对C#程序设计有一定的借鉴价值,分享给大家供大家参考之用。具体方法如下
- mybatis多层级collection嵌套json结构第一步查询第一层查询,将第一层的id传递到第二层当条件查询