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(); } }

浙公网安备 33010602011771号