SQLite数据库存储(一)【安卓学习笔记】

对于MODE_PRIVATE,MODE_APPEND两种模式,对写文件的影响有什么不同?
MODE_PRIVATE:该文件只能被当前程序读写,会把原来的内容覆盖掉
MODE_APPEND:该文件的内容可追加,不会把原来的内容覆盖掉,新写的内容追加在文件后面
但是对于修改文件中的部分内容,应该怎么做呢?这就需要我们用到SQLite数据库

主要内容:

  • 创建和打开一个SQLite 数据库
  •  数据库本身和它的表 
    
  • SQLite数据管理
  •  增删改查
    

SQLite介绍

  • 轻量级的嵌入式本地数据库 跨平台(ios,android等系统中都有)

  • 通过文件保存数据(而有些大型数据库需要服务器进程来处理,tomcat等),导出之后的文件可以在别的平台上使用

  • 数据类型:null,integer,real,text,blob;
    对于varchar(n),char(n),decimal(p,s),SQLite数据库会自动转换

  • SQLite相关的类:SQLiteOpenHelper,SQLiteDataBase,ListView
    SQLiteOpenHelper:用于打开数据库,如果存在数据库就打开;如果不存在就创建数据库
    SQLiteDataBase:数据库本身的对象,提供增删改查的方法
    ListView:把数据库可视化

创建一个数据库

SQLiteOpenHelper类:声明一个类用于创建一个新的数据库或者打开一个已存在的*.db file

public class MyHelper extends SQLiteOpenHelper {
    public MyHelper(Context context){//构造方法:创建或打开数据库文件“**.db”
        super(context,"**.db",null,1);
        //第一个参数:上下文
        // 第二个参数:要打开或创建的数据库名称
        //第三个参数:游标工厂
        //第四个参数:数据库的版本号
    }
    @Override
    public void onCreate(SQLiteDatabase db) {//操纵数据(增删改查)
     }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //数据库升级操作
    }
}

创建一个MyHelper类继承SQLiteOpenHelper类,主要实现的方法有3个:
①public MyHelper(Context context)构造方法,对应父类的构造方法 super(context,"**.db",null,1)
第一个参数:上下文
第二个参数:要打开或创建的数据库
第三个参数:游标工厂
第四个参数:数据库的版本号
②public void onCreate(SQLiteDatabase db)数据库数据管理(增删改查,创建表)的操作基本都在这里完成
③public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)数据库升级操作
第一个参数:数据库对象
第二个参数:旧的版本号
第三个参数:新的版本号

例子:记录玩家id和金币数量

第一步:创建GameHelper类继承SQLiteOpenHelper类
GameHelper.java

public class GameHelper extends SQLiteOpenHelper {
    public GameHelper(Context context){//构造方法:创建或打开数据库文件“game.db”
        super(context,"game.db",null,1);
        //第一个参数:上下文
        // 第二个参数:要打开或创建的数据库名称
        //第三个参数:游标工厂
        //第四个参数:数据库的版本号
    }
    @Override
    public void onCreate(SQLiteDatabase db) {//插入表
        String sql = "CREATE TABLE player(player_id VARCHAR(16),coin INTEGER)";//把关键字大写,字段名小写
        db.execSQL(sql);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //数据库升级操作
    }
}

第二步:在MainActivity中操纵数据库
MainActivity.java
打开数据库:

package com.example.sqlitedatabase;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    private GameHelper helper;
    private static final String TAG="GameHelper";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        helper = new GameHelper(this.getApplicationContext());//把整个APP的上下文传递过去,不管MainActivity是死是活
        Log.i(TAG,"open");
    }
}

用new GameHelper(this.getApplicationContext())方法获取GameHelper对象实例,GameHelper类需要一个上下文参数,这里我们把this.getApplicationContext()整个APP的上下文传递过去,增强它的稳定性。如果用this的话,我们进入或退出MainActivity会对其稳定性产生影响
当我们创建数据库的时候,首先调用的是GameHelper类中的public GameHelper(Context context)这个构造方法,如果数据库的版本号与1相匹配,则直接打开,然后调用onCreate()方法;如果数据库的版本号与1不匹配,则调用onUpgrade()方法,进行升级操作。
需要注意的是,GameHelper类就是一个普通的类,与四大组件不同,它不会在AndroidManifest.xml文件中产生GameHepler节点
数据库管理
SQLiteDatabase db = helper.getWritableDatabase();
SQLiteDatabase类提供数据管理方法(创建表增删改查)
execSQL(SQL指令) 方法用来执行SQL语句

1.增加insert操作
①SQLiteDatabase db=helper.getWritableDatabase();
②ContentValues value = new ContentValues();
③value.put(“name”,name);
④long id = db.insert(TableName,null,value);
⑤db.close()
用ContentValues对象存储临时数据,它相当于数据库中的一条记录
它也采用键值对的方式存储数据
Insert(tablename,null,values)方法用来插入数据,第一个参数是数据表的名称,第二个参数是要发现插入的行为空时就将这个列对应的值设置为null,第三个参数为ContentValues对象
示例:在文本编辑框输入玩家id和金币数量,点击ADD按钮,把数据存入SQLite数据库
SQLite数据库存储(一)【安卓学习笔记】_第1张图片
MainActivity.java
SQLite数据库存储(一)【安卓学习笔记】_第2张图片
SQLite数据库存储(一)【安卓学习笔记】_第3张图片
注意:Values.put(key,value)方法中的key必须与数据库中的字段名一致
coin金币值的类型是int,我们要把et_coin中的文本转换成String类型,再把String类型转换成int类型。
这里涉及到的一个知识点是:如何把EditText的文本转换成int类型?Integer.parseInt(et_coin.getText().toString().trim())
先用getText()方法获取文本内容,toString()方法转换成String类型,再用Integer.parseInt()方法把String类型转换成int类型
Insert()方法返回插入数据的位置,是long类型的
2.删除delete操作
①SQLiteDatabase db = helper.getWriteDatabase();
②int deleted_num=db.delete(TableName,“name=?”,new String[]{name});
③db.close();
Delete()方法中第一个参数是数据表名称,第二个参数是删除操作的条件这里是根据name来删除,第三个参数是条件筛选的值
3.更新update操作
①SQLiteDatabase db = helper.getWritableDatabase();
②ContentValues value = new ContentValues();
③value.put(“score”,score);
④long id = db.update(TableName,value,“name=?”,new String[]{name});
⑤db.close();
Update()方法中第一个参数是数据表名,第二个参数是更新的数据,第三个参数是更新条件,第四个参数是更新条件的值

你可能感兴趣的:(Android)