12.Android-SQLiteOpenHelper使用
1.SQLite介绍
SQLite,是一款轻型的数据库,它的优缺点有如下:
- 轻量级,适合嵌入式设备,并且本身不依赖第三方的软件,使用它也不需要“安装”。
- 并发(包括多进程和多线程)读写方面的性能不太理想。可能会被写操作独占,从而导致其它读写操作阻塞或出错
2.SQLiteOpenHelper介绍
为了在本地创建SQLite数据库,我们需要创建一个SQLiteOpenHelper的子类,这里取名的为MyOpenHelper类,然后还要写构造方法来初始化父类、以及abstract修饰的抽象方法:onCreate(SQLiteDatabase)、onUpgrade(SQLiteDatabase,int,int).
2.1 为什么要创建SQLiteOpenHelper的子类(MyOpenHelper类)?
因为SQLiteOpenHelper不知道我们要创建的数据库是什么名字,以及表的内容,所以我们要创建MyOpenHelper类.
3.SQLiteOpenHelper构造方法
构造方法用来创建数据库文件的,构造方法如下:
public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version);
//第一个参数:上下文
//第二个参数:数据库文件的名字,如果传入null 则表示创建临时数据库,在应用退出之后,数据就会丢失
//第三个参数:游标工厂 如果使用系统默认的游标工厂就传入null,一般都填null
//第四个参数:数据库的版本号 用版本号来控制数据库的升级和降级 版本号从1开始
比如创建一个demo.db,我们只需要在MyOpenHelper类构造方法里填入下面代码即可:
super(context, "demo.db", null, 1);
4.public abstract void onCreate (SQLiteDatabase db)
- 参数db : 数据库对象,这里通过db.execSQL(String)来创建表.
onCreate用来创建数据库表结构的,该函数在第一次创建数据库时调用,也就是在调用SQLiteOpenHelper类的getWritableDatabase()或者getReadableDatabase()时会调用该方法,如下图所示:

可以看到只有调用getWritableDatabase()或者getReadableDatabase()时,才会真正创建数据库。
- getReadableDatabase() : 获取一个只读数据库(不能写入)
- getWritableDatabase () : 获取一个可写的数据库,不再操作的时候,一定要close()关闭数据库,如果磁盘已满,获取将会报错.
比如创建一个student学生表,标题分别为id、name、score、class,填入下面代码即可:

5.public abstract void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion)
- db : 数据库对象,通过db.execSQL(String)来执行sql语句
- oldVersion : 显示之前旧的数据库版本。
- newVersion : 显示升级之后的新数据库版本。
当数据库需要升级时调用。使用此方法删除表、添加表或执行升级到新模式版本所需的任何其他操作。
如果添加新列,可以使用ALTER TABLE将它们插入活动表。如果重命名或删除列,可以使用ALTER TABLE重命名旧表,然后创建新表,然后用旧表的内容填充新表。
6.数据库增删改查
实现了SQLiteOpenHelper的子类(MyOpenHelper类)后,就有了数据库了,接下来我们便可以对SQLiteDatabase类进行数据库增删改查
6.1 通过SQLiteDatabase getWritableDatabase()来获取SQLiteDatabase类.
SQLiteDatabase类中常用方法如下所示:
public Cursor rawQuery (String sql, String[] selectionArgs);
// rawQuery:查询数据库内容,并将查询到的结果集保存在Cursor游标类中,并返回.
// sql:填入select查询语句
// selectionArgs:如果sql参数填入的内容是正常语句,则这里填NULL,如果是where子句中包含?,则将会被selectionArgs中的值替换. void execSQL(String sql);
//用来执行INSERT、UPDATE 或 DELETE 的sql语句
Cursor类游标默认是指向所有结果之前的一行,然后通过moveToNext()方法就能获取每一行结果的内容
示例如下-读出student表里的内容:
SQLiteDatabase database = new MyOpenHelper(this).getWritableDatabase(); //获取数据库
Cursor cursor = database.rawQuery("select * from student", null); //查询student表内容
while (cursor.moveToNext()) {
//可以通过 getXXX方法 获取每一行数据
String name = cursor.getString(cursor.getColumnIndex("name")); //获取当前游标所在行下的name列内容
String score = cursor.getString(cursor.getColumnIndex("score"));//获取当前游标所在行下的score列内容
System.out.println("name=" + name + " score =" + score);
}
cursor.close();
database.close();
7.安卓示例-查询添加删除示例
界面如下:

操作示例如下:

如下图所示,可以看到我们刚刚操作的数据库:

打开后,如下图所示,就可以看到我们刚刚写入的数据:

8.具体代码实现
8.1 activity_main.xml如下所示:
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <EditText
android:id="@+id/et_query"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="这里显示要查询的内容"
android:textSize="12sp"
android:minLines="10" /> <Button
android:id="@+id/btn_query"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@id/et_query"
android:text="查询内容"
/> <TextView
android:id="@+id/textView1" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@id/btn_query" android:paddingTop="50dp"
android:text="名字:" /> <EditText
android:id="@+id/et_nameAdd"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/textView1"
android:layout_toRightOf="@id/textView1"
android:textSize="11sp" /> <TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/et_nameAdd"
android:layout_alignBaseline="@id/textView1"
android:text="成绩:" /> <EditText
android:id="@+id/et_scoreAdd"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/textView1"
android:layout_toRightOf="@id/textView2"
android:textSize="11sp" /> <TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/et_scoreAdd"
android:layout_alignBaseline="@id/textView1"
android:text="班级:" /> <EditText
android:id="@+id/et_classAdd"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/textView1"
android:layout_toRightOf="@id/textView3"
android:textSize="11sp" /> <Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/textView1"
android:layout_toRightOf="@id/et_classAdd"
android:text="添加"
android:textSize="11sp" /> <TextView
android:id="@+id/textView4" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:paddingBottom="20dp"
android:text="要删除的id:" /> <EditText
android:id="@+id/et_deleteId"
android:layout_width="140dp" android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView4"
android:layout_toRightOf="@+id/textView4"
android:textSize="11sp" /> <Button
android:id="@+id/btn_deleteId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/et_deleteId"
android:layout_alignParentRight="true"
android:textSize="13sp"
android:text="删除"/> </RelativeLayout>
8.2 MyOpenHelper.java如下所示:
public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context) {
//这里创建一个数据库,名字为demo.db
super(context, "demo.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
//onCreate用来创建数据库表结构的,这里创建一个student学生表,标题分别为id、name、score、class
db.execSQL("CREATE TABLE student ("
+"id INTEGER PRIMARY KEY AUTOINCREMENT, "
+"name VARCHAR(40) NOT NULL, "
+"score INTEGER NOT NULL, "
+"class VARCHAR(40) NOT NULL)");
System.out.println("onCreate 创建表");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//实现版本升级的函数
System.out.println("onupgrade oldVersion"+oldVersion+"newVersion"+newVersion);
switch (oldVersion) {
case 1: //如果之前版本号为1.(标题只有id、name、score、class),那么将添加科目和考号标题
db.execSQL("alter table info add age 科目");
db.execSQL("alter table info add age 考号");
break;
}
}
}
8.3 MainActivity.java如下所示:
public class MainActivity extends Activity {
private MyOpenHelper openHelper;
private EditText et_nameAdd;
private EditText et_scoreAdd;
private EditText et_classAdd;
private EditText et_query;
private EditText et_deleteId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
openHelper = new MyOpenHelper(this);
et_nameAdd = (EditText)findViewById(R.id.et_nameAdd);
et_scoreAdd = (EditText)findViewById(R.id.et_scoreAdd);
et_classAdd = (EditText)findViewById(R.id.et_classAdd);
et_query = (EditText)findViewById(R.id.et_query);
et_deleteId = (EditText)findViewById(R.id.et_deleteId);
//实现查询数据库功能
Button btn_query = (Button)findViewById(R.id.btn_query);
btn_query.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase readableDatabase = openHelper.getReadableDatabase();
Cursor rawQuery = readableDatabase.rawQuery("select * from student", null);
StringBuilder text = new StringBuilder();
text.append("query length:"+String.valueOf(rawQuery.getCount()));
while(rawQuery.moveToNext()){
String id = rawQuery.getString(rawQuery.getColumnIndex("id"));//获取当前游标所在行下的id列内容
String name = rawQuery.getString(rawQuery.getColumnIndex("name")); //获取当前游标所在行下的name列内容
String score = rawQuery.getString(rawQuery.getColumnIndex("score"));//获取当前游标所在行下的score列内容
String classs = rawQuery.getString(rawQuery.getColumnIndex("class"));//获取当前游标所在行下的class列内容
text.append("\r\n id:"+id+" 名字:"+name+" 成绩:"+score+" 班级:"+classs);
}
rawQuery.close();
readableDatabase.close();
et_query.setText(text.toString());
}
});
//实现添加数据项功能
Button btn_add = (Button)findViewById(R.id.btn_add);
btn_add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String name = et_nameAdd.getText().toString().trim();
String score = et_scoreAdd.getText().toString().trim();
String classs = et_classAdd.getText().toString().trim();
if(TextUtils.isEmpty(name)||TextUtils.isEmpty(score)||TextUtils.isEmpty(classs))
{
Toast.makeText(MainActivity.this, "添加的内容不能为空", Toast.LENGTH_SHORT).show();
return;
}
String sql = "INSERT INTO student(name, score,class) "
+"VALUES ('"+name+"', "+score+", '"+classs+"')";
SQLiteDatabase writableDatabase = openHelper.getWritableDatabase();
writableDatabase.execSQL(sql);
writableDatabase.close();
System.out.println(sql);
}
});
//实现通过ID号来删除某一行数据项功能
Button btn_deleteId = (Button)findViewById(R.id.btn_deleteId);
btn_deleteId.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String id = et_deleteId.getText().toString().trim();
if(TextUtils.isEmpty(id)){
Toast.makeText(MainActivity.this, "删除的内容不能为空", Toast.LENGTH_SHORT).show();
return;
}else if(!TextUtils.isDigitsOnly(id)){
Toast.makeText(MainActivity.this, "请填入要删除的数字!", Toast.LENGTH_SHORT).show();
return;
}
SQLiteDatabase readableDatabase = openHelper.getReadableDatabase();
readableDatabase.execSQL("DELETE FROM student WHERE id = "+id+"");
System.out.println("DELETE FROM student WHERE id = "+id+"");
Toast.makeText(MainActivity.this, "已删除ID"+id+"所在的一行!", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
12.Android-SQLiteOpenHelper使用的更多相关文章
- Android SQLiteOpenHelper(二)
上一篇我们已经了解了SQLiteOpenHelper 和 构造函数. 现在我们就来掌握一下:onCreate( ) onUpgrade( ) onDowngrade( ) public void ...
- Android SQLiteOpenHelper(一)
SQLiteOpenHelper api解释: A helper class to manage database creation and version management. You creat ...
- Android SQLiteOpenHelper类的使用
SQLiteOpenHelper类是Android平台提供的用于SQLite数据库的创建.打开以及版本管理的帮助类.一般需要继承并这个类并实现它的onCreate和onUpgrade方法,在构造方法中 ...
- android SQLiteOpenHelper使用示例
我们大家都知道Android平台提供给我们一个数据库辅助类来创建或打开数据库,这个辅助类继承自SQLiteOpenHelper类,在该类的 构造器中,调用Context中的方法创建并打开一个指定名称的 ...
- android SQLiteOpenHelper 使用
1.实体 package mydemo.mycom.demo2.entity; public class UserInfo { private int id; private String usern ...
- Android SQLiteOpenHelper Sqlite数据库升级onUpgrade
Android Sqlite数据库升级,在Android APP开发之中,非常常见: 在确定原来的数据库版本号之后,在原来数据库版本号+1,就会执行onUpgrade方法,进行数据库升级操作: 在on ...
- Android SQLiteOpenHelper Sqlite数据库的创建与打开
Android Sqlite数据库是一个怎样的数据库? 答:是一种嵌入式小型设备,移动设备,的数据库,应用在穿戴设备(例如:智能手表,计算手环 等等),移动设备(例如:Android系统类型的手机 等 ...
- Android SqliteOpenHelper详解
一. SQLite介绍 SQLite是android内置的一个很小的关系型数据库. SQLite的官网是http://www.sqlite.org/,可以去下载一些文档或相关信息. 博客中有一篇有稍微 ...
- Android · SQLiteOpenHelper实例PrivateContactsDBHelper
package privatecontact; import android.content.ContentValues; import android.content.Context; import ...
- 12.Android之Tabhost组件学习
TabHost是整个Tab的容器,TabHost的实现有两种方式: 第一种继承TabActivity,从TabActivity中用getTabHost()方法获取TabHost.各个Tab中的内容在布 ...
随机推荐
- python进阶之面向对象初识
面向对象 不同于面向过程的编程思想,面向对象是一种将程序抽象为一个个对象的编程思想,能更好的处理现实世界到的一些复杂问题. 通过下面的例子来初步了解面向对象的编程方式. class Person: # ...
- MVC3 学习笔记 之(ajax表单)
mvc 提供了一种ajax提交表单的方式.与普通表单不同的是,它是一个异步表单. 在开始使用之前,需要引用以下文件: <script src="@Url.Content("~ ...
- H3C生成树的不足
- 深度解读 - TDD详细(测试驱动开发)
本文结构: 什么是 TDD 为什么要 TDD 怎么 TDD FAQ 学习路径 延伸阅读 什么是 TDD TDD 有广义和狭义之分,常说的是狭义的 TDD,也就是 UTDD(Unit Test Driv ...
- dotnet Framework 源代码 · Ink
本文是分析 .NET Framework 源代码的系列,主要告诉大家微软做笔迹用的思路,怎么做的笔迹才是高性能的,用户体验比较好的.我会告诉大家源代码的思想,当然这个文章会比较无聊.如果你是想做笔迹的 ...
- 基于 HTML5 + WebGL 的无人机 3D 可视化系统
前言 近年来,无人机的发展越发迅速,既可民用于航拍,又可军用于侦察,涉及行业广泛,也被称为“会飞的照相机”.但作为军事使用,无人机的各项性能要求更加严格.重要.本系统则是通过 Hightopo 的 ...
- Kubernetes从私有镜像仓库中拉取镜像
当我们尝试从私有仓库中拉取镜像时,可能会收到这样提示:requested access to the resource is denied Error response from daemon: pu ...
- 0012 sublime快捷操作emmet语法
Emmet的前身是Zen coding,它使用缩写,来提高html/css的编写速度. 生成标签 直接输入标签名 按tab键即可 比如 div 然后tab 键, 就可以生成 如果想要生成多个相同标签 ...
- 洛谷P-4782 2-sat+Tarjan
https://www.luogu.org/problemnew/solution/P4782 这里的大佬已经说的够好了 #include<iostream> #include<cs ...
- leetcode.1275找出井字棋的获胜者
A 和 B 在一个 3 x 3 的网格上玩井字棋. 井字棋游戏的规则如下: 玩家轮流将棋子放在空方格 (" ") 上.第一个玩家 A 总是用 "X" 作为棋子, ...