4.数据持久化->SQLite数据库

Android系统是内置数据库的!!!SQLite是一款轻量级的关系型数据库,运行速度快占资源少(几百KB内存就够)

1.写一个类去继承SqliteOpenhelper

2.实现里面的方法,创建构造方法

  参数解释:

  //实现参数短的构造方法就行了
/*
* context 上下文
* name 数据库名称
* factory 游标工厂
* version 版本号
* */
吗 //游标就像指针一样,去找数据的

3.创建这个子类对象,再调用getWritableDatabase创建数据库

可以在/data/data下找到我们对应的项目名称文件夹以找到我们的数据库文件

我们的目录结构如下所示:

 

 

 

 Constants我定义是装常量的地方,比如说什么数据库名啦之类的

Dao是增删改查

DatabaseHelper是控制数据库和表创建的,以及版本的升级问题

Constants.class

package com.example.mysqlite;

//常量
public class Constants {
    //数据库名称
    public static final String DATABASE_NAME = "sunofbeaches.db";
    //版本号  注意一开始版本号要写成最初始的奥  不能一运行就整第三个版本
    public static final int VERSION_CODE = 1;
    //表名
    public static final String TABLE_NAME = "employee";

}
DatabaseHelper.class   继承SQLiteOpenHelper就能操作数据库了
package com.example.mysqlite2;

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

import androidx.annotation.Nullable;

public class DatabaseHelper extends SQLiteOpenHelper {

    //实现参数短的构造方法就行了
    /*
    * context    上下文
    * name       数据库名称
    * factory    游标工厂
    * version    版本号
    * */
    //游标就像指针一样,去找数据的
    public DatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory,version);
    }

    //只有第一次创建数据库时调用该函数
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        Log.e("TAG","创建数据库······");
        //创建字段
        //建表
        String sql = "create table " + Constants.TABLE_NAME+"(_id integer,name varchar(50),age integer,salary integer)";
        //执行SQL语句
        sqLiteDatabase.execSQL(sql);
        Log.e("TAG","创建表······");
    }

    //这块不用我们操作,版本号变了系统自动调用
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        //升级数据库时调用
        Log.e("TAG","升级数据库······");
        //比如说我们想再加一个字段或者删除一个字段  去把版本号改一下就会执行这里面的东西了
        //sql: alter table table_name add phone integer;
//        String sql = "alter table " +Constants.TABLE_NAME + " add phone integer";
//        sqLiteDatabase.execSQL(sql);

        //但是不同的版本有不同需求咋整?
        //注意 版本号不能降级只能升级
        String sql;
        switch (oldVersion){
            case 1:
                sql = "alter table " + Constants.TABLE_NAME + " add phone integer";
                sqLiteDatabase.execSQL(sql);
                break;
            case 2:
                sql = "alter table " + Constants.TABLE_NAME + " add address varchar";
                sqLiteDatabase.execSQL(sql);
                break;
            case 3:
                sql = "alter table " + Constants.TABLE_NAME + " add bb varchar";
                sqLiteDatabase.execSQL(sql);
                break;
        }
    }
}

Dao.class    写增删改查的

 

package com.example.mysqlite2;

//数据库的增删改查

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

public class Dao {

    DatabaseHelper helper;

    //新建类的时候就开始创建数据库
    public Dao(Context context) {
          //创建数据库   context是上下文
        helper = new DatabaseHelper(context, Constants.DATABASE_NAME,null, Constants.VERSION_CODE);
        helper.getWritableDatabase();
    }

    /*
    * 数据库直接执行了onUpgrade方法,而你的创建表方法写在了onCreate()方法,
    * (我的就是这种错误,前两种都检查了...)----
    * 这个时候要在onUpgrade方法中先执行db.delete(TAB_NAME,null,null),
    * 然后执行创建操作db.execSQL(...)
    * */
    public void insert(){
        SQLiteDatabase writableDatabase = helper.getWritableDatabase();
        //用占位符?防止sql注入
        String sql = "insert into "+ Constants.TABLE_NAME+"(_id,name,age,salary) values(?,?,?,?)";
        writableDatabase.delete(Constants.TABLE_NAME,null,null);
        writableDatabase.execSQL(sql,new Object[]{1,"DaMing",60,1});
        writableDatabase.close();
    }

    public void delete(){
        SQLiteDatabase writableDatabase = helper.getWritableDatabase();
        //用占位符?防止sql注入
        String sql = " delete from " +Constants.TABLE_NAME + " where age = 60";
        writableDatabase.execSQL(sql);
        writableDatabase.close();
    }

    public void update(){
        SQLiteDatabase writableDatabase = helper.getWritableDatabase();
        //用占位符?防止sql注入
        String sql = " update " + Constants.TABLE_NAME + " set salary = 2 where age = 60";
        writableDatabase.execSQL(sql);
        writableDatabase.close();
    }

    public void query(){
        SQLiteDatabase readableDatabase = helper.getReadableDatabase();
        //用占位符?防止sql注入
        String sql = " select * from " + Constants.TABLE_NAME;
        //返回类型是游标
        Cursor cursor = readableDatabase.rawQuery(sql, null);
        while(cursor.moveToNext()){
            //获取名字在第几列
            int index = cursor.getColumnIndex("name");
            String name = cursor.getString(index);
            Log.e("name = ",name);
        }
        cursor.close();
        readableDatabase.close();
    }
}

 

MainActivity.class

package com.example.mysqlite2;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

        //间接的创建了数据库
        Dao dao = new Dao(this);

        dao.query();

        dao.insert();
        dao.query();
        dao.update();
        dao.query();
        dao.delete();
        dao.query();

    }

}

 

 

 这样写sql很容易出问题,比如说空格等问题,所以Google给我们提供了API供我们增删改查

 还是建议用上边那种方法吧

package com.example.mysqlite2;

//数据库的增删改查

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

public class Dao {

    DatabaseHelper helper;

    //新建类的时候就开始创建数据库
    public Dao(Context context) {
          //创建数据库   context是上下文
        helper = new DatabaseHelper(context, Constants.DATABASE_NAME,null, Constants.VERSION_CODE);
        helper.getWritableDatabase();
    }

    /*
    * 数据库直接执行了onUpgrade方法,而你的创建表方法写在了onCreate()方法,
    * (我的就是这种错误,前两种都检查了...)----
    * 这个时候要在onUpgrade方法中先执行db.delete(TAB_NAME,null,null),
    * 然后执行创建操作db.execSQL(...)
    * */
    public void insert(){
        SQLiteDatabase writableDatabase = helper.getWritableDatabase();
        //往里存值
        //设置值
        ContentValues values = new ContentValues();
        values.put("_id",1);
        values.put("name","zouao22");
        values.put("salary",123);
        values.put("age",433);
        //执行
        writableDatabase.insert(Constants.TABLE_NAME,null,values);

        writableDatabase.close();
    }

    public void delete(){
        SQLiteDatabase writableDatabase = helper.getWritableDatabase();
        
        //删除
        int delete = writableDatabase.delete(Constants.TABLE_NAME, null, null);
        Log.e("受影响行数", String.valueOf(delete));

        writableDatabase.close();
    }

    public void update(){
        SQLiteDatabase writableDatabase = helper.getWritableDatabase();

        //更新数据
        ContentValues values = new ContentValues();
        values.put("age",123456789);
        writableDatabase.update(Constants.TABLE_NAME,values,null,null);
        writableDatabase.close();
    }

    public void query(){
        SQLiteDatabase readableDatabase = helper.getReadableDatabase();

        Cursor cursor = readableDatabase.query(Constants.TABLE_NAME, null, null, null, null, null, null);

        while (cursor.moveToNext()){
            int anInt = cursor.getInt(0);
            String name = cursor.getString(1);
            Log.e("id: ", String.valueOf(anInt));
            Log.e("name: ", String.valueOf(name));

        }

        cursor.close();
        readableDatabase.close();
    }
}

 

 


 

posted @ 2021-09-14 17:11  涂妖教  阅读(218)  评论(0)    收藏  举报