Android数据存储(二)—— SQLite

SQLite

为什么要学习SQLite

1.SharedPreferences是以XML形式存储数据的,只适合存储基本数据类型的数据。
2.文件存储的内容在提取( 解析) 数据时,相对复杂。
3.当数据量大,结构复杂时,如果使用SharedPreferences和文件存储对数据的操作将变得非常复杂,容易出错,效率低下,Android 中提供了SQLite数据存储来帮助我们解决这些问题。

什么是SQLite

1.SQLite 数据库存储是Android系统提供的数据存者方式之一。
2.SQLite 是专为嵌入式设备设计的一款轻量级数据库。
3.SQLite 占用资源非常低,在嵌入式设备中,只需要几百K的内存。
4.SQLite 支持标准的SQL语法,遵循数据库的ACID事务。
5.SQLite 不要安装,不需要用户名密码就可以直接使用。

SQLite的常用数据类型

text 文本型
integer 整型
real 浮点型

如何使用SQLite

1.创建数据库和数据表。
2.添加数据。
3.修改数据。
4.删除数据。
5.查询数据。

创建数据库和数据表的步骤

1.新建类继承SQLiteOpenHelper。
2.实现构造方法。
3.重写onCreate方法。
4.重写onUpgrade方法。
5.实例化SQLiteOpenHelper的子类对象。
6.调用getReadableDatabase方法或getWritableDatabase

SQLiteOpenHelper类

1.SQLiteOpenHelper是一个数据库辅助类,用来管理数据库的创建和版本。通过继承这个类,实现它的一些方法来对数据库进行一些操作。
2.SQLiteOpenHelper是一个抽象类,子类需要重写onCreate和onUpgrade方法,并添加一个构造方法。

SQLiteOpenHelper构造方法

构造方法

1.父类中未提供默认构造方法,必须显示调用父类的构造方法。
2 需要传递创建的数据库名称以及数据库版本号。

方法参数

SQLiteOpenHelper(Contex context,String name,CursorFactory factory,int version)
1.Context context::上下文环境。
2.String name: 数据库名。
3.CursorFactory factory:允许开发者查询数据的时候返回一个自定义的Cursor,一般传入null。
4.int version:当前的数据库的版本号,可用于对数据库进行升级操作。

SQLiteOpenHelper类的常用方法

onCreate方法

1.此方法只会在第一次创建时执行,只会执行一次。
2.在此方法中使用标准的SQL语句创建数据库。
3.onCreat方法有一个SQLiteDatabase对象参数,通过调用execSQL方法执行建表SQL语句。

onUpgrade

1.此方法用来升级数据库表结构时触发。
2.当需要增加表字段或增加表时,传递进来一个新的数据表版本号,就会触发此方法。
3.在此方法中可以重新更新现有数据表结构。

SQLiteDatabase对象的方法

SQLiteOpenHelper子类对象

实例化SQLiteOpenHelper子类对象,创建数据库和数据库表。

SQLiteDatabase对象

数据库操作对象,用来连接数据库,并可以对数据表进行增删改查。

getReadableDatabase方法

以只读方式打开数据库,返回只读的SQLiteDatabase对象,一般在查询时使用。

getWritableDatabase方法

以读写方式打开数据库,返回可读写的SQLiteDatabase对象,一般在增删改时使用。

创建数据库和数据表以及增删改查实例

package com.example.pc.sqlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by pc on 2018/3/20.
 */
//创建类继承SQLiteOpenHelper
public class DBHelper extends SQLiteOpenHelper {

    //建表语句
    private String sq1 = "create table student(" +
            "id integer primary key autoincrement not null," +
            "age integer," +
            "name text," +
            "score real" +
            ")";
//context name数据库名字
// factory 数据库进行查询的时候会返回一个cursor,这个cursor就是在上面的factory中产生的。如果有需求,可以自定义factory,这样返回的cursor就会符合自己的需求!
//version 数据库版本号
    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建数据表结构语句
        db.execSQL(sq1);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //更新数据库表机构

        db.execSQL("ALTER TABLE student ADD COLUMN other TEXT");
    }
}

package com.example.pc.sqlite;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;


public class MainActivity extends Activity implements View.OnClickListener {

    private Button insertBtn;
    private Button searchBtn;
    private Button reviseBtn;
    private Button deleteBtn;
    private EditText nameEt;
    private EditText reviseEt;

    private DBHelper dbHelper;
    private SQLiteDatabase sqldb;

    private static final String TABLE_NAME = "student";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bindID();

        dbHelper = new DBHelper(this,"mydb",null,1);
    }

    private void bindID() {
        //绑定ID和监听事件
        nameEt = findViewById(R.id.name_et);
        reviseEt = findViewById(R.id.revise_et);
        insertBtn = findViewById(R.id.insert_btn);
        searchBtn = findViewById(R.id.search_btn);
        reviseBtn = findViewById(R.id.revise_btn);
        deleteBtn = findViewById(R.id.delete_btn);


        insertBtn.setOnClickListener(this);
        searchBtn.setOnClickListener(this);
        reviseBtn.setOnClickListener(this);
        deleteBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            //插入数据
            case R.id.insert_btn:
                SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put("name",nameEt.getText().toString());
                sqLiteDatabase.insert("student",null,values);
                break;
                //读数据
            case R.id.search_btn:
                SQLiteDatabase sqLiteDatabase1 = dbHelper.getReadableDatabase();
                //使用游标得到一条条数据
                Cursor cursor = sqLiteDatabase1.query("student",null,null,null,null,null,null);
                cursor.moveToFirst();
                do {
                    //用游标去取“name”的数据
                    String name = cursor.getString(cursor.getColumnIndex("name"));
                    Log.e("NAME",name);
                }while (cursor.moveToNext());
                //关闭游标
                cursor.close();
                break;
                //修改数据
            case R.id.revise_btn:
                String name = nameEt.getText().toString();
                String newName = reviseEt.getText().toString();
                SQLiteDatabase sqLiteDatabase2 = dbHelper.getWritableDatabase();
                ContentValues values1 = new ContentValues();
                values1.put("name",newName);
                //第一个是表名字
                //第二个是要修改的字段
                //第三个参数是WHERE语句
                //第四个参数是填充第三个参数中的占位符
                //如果第三四个参数为null,那就将所有记录都改掉
                sqLiteDatabase2.update("student",values1,"name=?",new String[]{name});
                break;
                //删除数据
            case R.id.delete_btn:
                SQLiteDatabase sqLiteDatabase3 = dbHelper.getWritableDatabase();
                String name1 = nameEt.getText().toString();
                //第一个是表名字
                //第二个参数是WHERE语句(即执行条件,删除哪条数据)
                //第三个参数是WHERE语句中占位符(即"?"号)的填充值
                sqLiteDatabase3.delete("student","name=?",new String[]{name1});
                break;
        }

    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/name_et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入学生姓名"
        />
    <EditText
        android:id="@+id/revise_et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入修改后的学生姓名"
        />

    <Button
        android:id="@+id/insert_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="插入"
        />
    <Button
        android:id="@+id/search_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查询"
        />
    <Button
        android:id="@+id/revise_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="修改"/>
    <Button
        android:id="@+id/delete_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="删除"/>

</LinearLayout>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值