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使用的更多相关文章

  1. Android SQLiteOpenHelper(二)

    上一篇我们已经了解了SQLiteOpenHelper 和 构造函数. 现在我们就来掌握一下:onCreate( )  onUpgrade( )  onDowngrade( ) public void ...

  2. Android SQLiteOpenHelper(一)

    SQLiteOpenHelper api解释: A helper class to manage database creation and version management. You creat ...

  3. Android SQLiteOpenHelper类的使用

    SQLiteOpenHelper类是Android平台提供的用于SQLite数据库的创建.打开以及版本管理的帮助类.一般需要继承并这个类并实现它的onCreate和onUpgrade方法,在构造方法中 ...

  4. android SQLiteOpenHelper使用示例

    我们大家都知道Android平台提供给我们一个数据库辅助类来创建或打开数据库,这个辅助类继承自SQLiteOpenHelper类,在该类的 构造器中,调用Context中的方法创建并打开一个指定名称的 ...

  5. android SQLiteOpenHelper 使用

    1.实体 package mydemo.mycom.demo2.entity; public class UserInfo { private int id; private String usern ...

  6. Android SQLiteOpenHelper Sqlite数据库升级onUpgrade

    Android Sqlite数据库升级,在Android APP开发之中,非常常见: 在确定原来的数据库版本号之后,在原来数据库版本号+1,就会执行onUpgrade方法,进行数据库升级操作: 在on ...

  7. Android SQLiteOpenHelper Sqlite数据库的创建与打开

    Android Sqlite数据库是一个怎样的数据库? 答:是一种嵌入式小型设备,移动设备,的数据库,应用在穿戴设备(例如:智能手表,计算手环 等等),移动设备(例如:Android系统类型的手机 等 ...

  8. Android SqliteOpenHelper详解

    一. SQLite介绍 SQLite是android内置的一个很小的关系型数据库. SQLite的官网是http://www.sqlite.org/,可以去下载一些文档或相关信息. 博客中有一篇有稍微 ...

  9. Android · SQLiteOpenHelper实例PrivateContactsDBHelper

    package privatecontact; import android.content.ContentValues; import android.content.Context; import ...

  10. 12.Android之Tabhost组件学习

    TabHost是整个Tab的容器,TabHost的实现有两种方式: 第一种继承TabActivity,从TabActivity中用getTabHost()方法获取TabHost.各个Tab中的内容在布 ...

随机推荐

  1. Mule自带例子之flight-reservation

    1 配置效果图 2 应用的配置文件 <?xml version="1.0" encoding="UTF-8"?> <mule xmlns:sc ...

  2. 试用ZooKeeper

    ZooKeeper下载 通过ZooKeeper官网下载最新的稳定版本 解压ZooKeeper到某个目录,其目录结构为: 运行环境要求 系统环境 ZooKeeper对于市面上各种操作系统都有了不错的支持 ...

  3. 51nod 1380"夹克老爷的逢三抽一"(贪心+set)

    传送门 •参考资料 [1]:51Nod-1380-夹克老爷的逢三抽一 •题意 从长度为 n 的数组中抽取 $\frac{n}{3}$ 个不相邻的值使得加和最大(首尾也不能同时取) •题解 贪心选择当前 ...

  4. P1087 N个数的最大公约数

    题目描述 今天灵灵学习了使用欧几里得算法(即:辗转相除法)求解两个数的最大公约数.于是他决定用这个方法求解 \(N\) 个数的最大公约数. 输入格式 输入的第一行包含一个整数 \(N(1 \le N ...

  5. Junit 测试集(打包测试)实例

    测试集,直译过来的意思就是把测试集合起来,再详细一些就是把多个单元测试集合起来 .单元测试可以理解为:单个接口 或者单个类/方法 的测试 项目背景:测试基于spring开发的项目代码 实例模板:pac ...

  6. vmware虚拟机卸载干净在注册表的也需要删除

  7. asp dotnet core 支持客户端上传文件

    本文告诉大家如何在 asp dotnet core 支持客户端上传文件 新建一个 asp dotnet core 程序,创建一个新的类,用于给客户端上传文件的信息 public class Kanaj ...

  8. 2018.11.23 浪在ACM 集训队第六次测试赛

    2018.11.23 浪在ACM 集训队第六次测试赛 整理人:刘文胜 div 2: A: Jam的计数法 参考博客:[1] 万众 B:数列 参考博客: [1] C:摆花 参考博客: [1] D:文化之 ...

  9. codeforces 11D(状压dp)

    传送门:https://codeforces.com/problemset/problem/11/D 题意: 求n个点m条边的图里面环的个数 题解: 点的范围只有19,很容易想到是状压. dp[sta ...

  10. [NLP自然语言处理]谷歌BERT模型深度解析

    我的机器学习教程「美团」算法工程师带你入门机器学习   已经开始更新了,欢迎大家订阅~ 任何关于算法.编程.AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主 ...