SQLite 数据库存储
写在前面
SQLite 是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百K 的内存就足够了,因而特别适合在移动设备上使用。SQLite不仅支持标准的SQL 语法,还遵循了数据库的ACID 事务,所以只要你以前使用过其他的关系型数据库,就可以很快地上手SQLite。而SQLite 又比一般的数据库要简单得多,它甚至不用设置用户名和密码就可以使用。Android 正是把这个功能极为强大的数据库嵌入到了系统当中,使得本地持久化的功能有了一次质的飞跃。
文件存储和SharedPreferences存储毕竟只适用于去保存一些简单的数据和键值对,当需要存储大量复杂的关系型数据的时候,你就会发现以上两种存储方式很难应付得了。比如我们手机的短信程序中可能会有很多个会话,每个会话中又包含了很多条信息内容,并且大部分会话还可能各自对应了电话簿中的某个联系人。很难想象如何用文件或者SharedPreferences 来存储这些数据量大、结构性复杂的数据吧?但是使用数据库就可以做得到。那么我们就赶快来看一看,Android 中的SQLite 数据库到底是如何使用的。
1、需要了解的地方
- Android 为了让我们能够更加方便地管理数据库,专门提供了一个SQLiteOpenHelper 帮
助类,借助这个类就可以非常简单地对数据库进行创建和升级。 - 首先你要知道SQLiteOpenHelper 是一个抽象类,这意味着如果我们想要使用它的话,
就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper 中有两个抽象方法,分别是
onCreate()和onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两
个方法中去实现创建、升级数据库的逻辑。
- SQLiteOpenHelper 中还有两个非常重要的实例方法, getReadableDatabase() 和
getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在
则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不
同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对
象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。
这里我们希望创建一个名为BookStore.db 的数据库,然后在这个数据库中新建一张Book
表,表中有id(主键)、作者、价格、页数和书名等列。创建数据库表当然还是需要用建表
语句的,这里也是要考验一下你的SQL 基本功了,Book 表的建表语句如下所示:
sqlite
create table Book (
id integer primary key autoincrement,
author text,
price real,
pages integer,
name text)
只要你对SQL 方面的知识稍微有一些了解,上面的建表语句对你来说应该都不难吧。
SQLite 不像其他的数据库拥有众多繁杂的数据类型,它的数据类型很简单,integer 表示整型,real 表示浮点型,text 表示文本类型,blob 表示二进制类型。另外,上述建表语句中我们还使用了primary key 将id 列设为主键,并用autoincrement 关键字表示id 列是自增长的。
2、代码演示
1、创建SQLiteOpenHelper继承类,例如
package com.example.attendance_demo.DB;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
import androidx.annotation.Nullable;
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_Employees = "create table employee ("
+ "id text primary key, "
+ "name text unique, "
+ "password text, "
+ "department text, "
+ "post text)";
public static final String CREATE_Depart = "create table Depart ("
+ "id text primary key, "
+ "name text)";
public static final String CREATE_JiXiao = "create table Jixiao ("
+ "num integer primary key autoincrement, "
+ "eid text, "
+ "week text, "
+ "month text, "
+ "grade text, "
+ "quanqin text)";
private Context mContext;
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory
factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_Employees);
db.execSQL(CREATE_Depart);
db.execSQL(CREATE_JiXiao);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
2、MainActivity中调用
MyDatabaseHelper dbHelper = new MyDatabaseHelper(this, "Co.db", null, 1);
SQLiteDatabase db = dbHelper.getWritableDatabase();
SQLiteDatabase db2 = dbHelper.getReadableDatabase();
3、写入:
ContentValues values = new ContentValues();
values.put("id","1");
values.put("name","Admin");
values.put("password","123456");
values.put("department", (byte[]) null);
values.put("post","2");
db.insert("employee",null,values);
values.clear();
values.put("id","2");
…………………………………………………………
db.insert("employee",null,values);
4、查询并进行密码验证
final String user_str = id.getText().toString();
final String psw_str = pwd.getText().toString();
if (user_str.equals("") || user_str.equals("")) {
Toast.makeText(MainActivity.this, "密码不得为空!", Toast.LENGTH_SHORT).show();
}else {
Cursor cursor = db.query("employee", new String[]{"password","name","post"}, "id=?", new String[]{user_str}, null, null, null);
if(cursor.moveToNext()){
String psw_query=cursor.getString(cursor.getColumnIndex("password"));
name_query = cursor.getString(cursor.getColumnIndex("name"));
partSelector = cursor.getString(cursor.getColumnIndex("post"));
if(psw_str.equals(psw_query)){
db.close();
db2.close();
dbHelper.close();
Toast.makeText(MainActivity.this, "登陆成功,欢迎"+ name_query +"!", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "密码错误或用户不存在!", Toast.LENGTH_SHORT).show();
}
5、写入listview方法:
MyDatabaseHelper moh = new MyDatabaseHelper(this,"Co.db",null,1);
SQLiteDatabase sd = moh.getReadableDatabase();
ArrayList employeelist = new ArrayList<>();
//扫描数据库,将数据库信息放入studentlist
Cursor cursor = sd.rawQuery("select * from Jixiao",null);
while (cursor.moveToNext()){
int id = cursor.getInt(cursor.getColumnIndex("num"));
String eid = cursor.getString(cursor.getColumnIndex("eid"));
String grade = cursor.getString(cursor.getColumnIndex("grade"));
String quanqin = cursor.getString(cursor.getColumnIndex("quanqin"));
employeeInfo st = new employeeInfo(id,eid,grade,quanqin); //student_info存一个条目的数据
employeelist.add(st);//把数据库的每一行加入数组中
}
//获取ListView,并通过Adapter把studentlist的信息显示到ListView
//为ListView设置一个适配器,getCount()返回数据个数;getView()为每一行设置一个条目
lv = findViewById(R.id.employee_content_evaluate);
lv.setAdapter(new BaseAdapter() {
@Override
public int getCount() {
return employeelist.size();
}
//ListView的每一个条目都是一个view对象
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
//对ListView的优化,convertView为空时,创建一个新视图;convertView不为空时,代表它是滚出
//屏幕,放入Recycler中的视图,若需要用到其他layout,则用inflate(),同一视图,用findViewBy()
if (convertView==null){
view=View.inflate(getBaseContext(),R.layout.listviewadapter,null);
}else {
view = convertView;
}
return view
}
3、写在最后
引用时请标明出处
太棒啦!(๑•̀ㅂ•́)و✧
By 洋芋仙贝 at June 6th, 2022 at 03:10 pm.
@洋芋仙贝
抓到你了!
By Suk at June 19th, 2022 at 01:37 pm.
牛皮
By thanks at April 27th, 2022 at 07:11 am.
好耶!
By Gaze. at April 25th, 2022 at 04:04 pm.
@Gaze.
好耶!
By Suk at April 25th, 2022 at 08:14 pm.