Android【SQLite数据库存储】

SQLite 数据库存储

写在前面

SQLite 是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百K 的内存就足够了,因而特别适合在移动设备上使用。SQLite不仅支持标准的SQL 语法,还遵循了数据库的ACID 事务,所以只要你以前使用过其他的关系型数据库,就可以很快地上手SQLite。而SQLite 又比一般的数据库要简单得多,它甚至不用设置用户名和密码就可以使用。Android 正是把这个功能极为强大的数据库嵌入到了系统当中,使得本地持久化的功能有了一次质的飞跃。

文件存储和SharedPreferences存储毕竟只适用于去保存一些简单的数据和键值对,当需要存储大量复杂的关系型数据的时候,你就会发现以上两种存储方式很难应付得了。比如我们手机的短信程序中可能会有很多个会话,每个会话中又包含了很多条信息内容,并且大部分会话还可能各自对应了电话簿中的某个联系人。很难想象如何用文件或者SharedPreferences 来存储这些数据量大、结构性复杂的数据吧?但是使用数据库就可以做得到。那么我们就赶快来看一看,Android 中的SQLite 数据库到底是如何使用的。

1、需要了解的地方

  1. Android 为了让我们能够更加方便地管理数据库,专门提供了一个SQLiteOpenHelper 帮
    助类,借助这个类就可以非常简单地对数据库进行创建和升级。
  2. 首先你要知道SQLiteOpenHelper 是一个抽象类,这意味着如果我们想要使用它的话,
    就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper 中有两个抽象方法,分别是
    onCreate()和onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两
    个方法中去实现创建、升级数据库的逻辑。
  3. SQLiteOpenHelper 中还有两个非常重要的实例方法, getReadableDatabase() 和
    getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在
    则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不
    同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对
    象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。

这里我们希望创建一个名为BookStore.db 的数据库,然后在这个数据库中新建一张Book
表,表中有id(主键)、作者、价格、页数和书名等列。创建数据库表当然还是需要用建表
语句的,这里也是要考验一下你的SQL 基本功了,Book 表的建表语句如下所示:

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、写在最后

最后没有东西啦

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>