赞
踩
SQLite的注意事项:
android里面的SQLite数据库是由底层的sqlite.c的代码来动态生成的。
官方下载地址:https://www.sqliteexpert.com/download.html
模拟器下面的db数据库查找:
android系统封装了一个SqliteOpenHelper抽象工具类,来对SQLite进行增删改查。
示例:
实现通过点击按钮,来创建一个数据库,并且数据库中带有表格的效果。
<?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" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical"> <Button android:text="生成DB文件" android:onClick="createDB" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
MySqliteOpenHelper
package com.example.sqlitetest; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import androidx.annotation.Nullable; /** * MySqliteOpenHelper 工具类 单例模式(1.构造函数私有化,2.对外提供函数。) */ // 该类就可以理解为一个数据库了。 public class MySqliteOpenHelper extends SQLiteOpenHelper { // 单例模式 private static SQLiteOpenHelper mInstance; // 提供对外提供的函数。 public static synchronized SQLiteOpenHelper getInstance(Context context){ if (mInstance == null){ mInstance = new MySqliteOpenHelper(context,"itholmes.db",null,1); } return mInstance; } /** * 通过构造函数,将数据库名称 , 数据库版本号等定义出来。因此,必须要声明一个构造函数。 * @param context context就是环境,在此环境下进行创建数据库。 * @param name 数据库名称 * @param factory 工厂 * @param version 版本 数据库升级后需要不断加1操作! */ public MySqliteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } /** * 数据库初始化用的: * 创建表 表数据初始化 数据库第一次创建的时候调用。第二次发现有该表了就不会重复创建了! * 此函数只会执行一次。 因此,添加了新的数据库或者修改了数据库,必须要对应项目目录将databases目录下的db等文件删除。 * @param sqLiteDatabase */ @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { // 创建表:person表。 // 主键: _id(标准) 或者 id(不标准) 必须唯一,也可以添加自动增长 。 String sql = "create table persons(" + "_id integer primary key autoincrement," + "name text" + ")"; // 执行sql sqLiteDatabase.execSQL(sql); } // 数据库升级用的 @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } }
MainActivity
package com.example.sqlitetest; import androidx.appcompat.app.AppCompatActivity; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.os.Bundle; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // 生成DB文件 public void createDB(View view){ // 通过MySqliteOpenHelper来操作 SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this); // databases数据库文件的创建,靠下面这句话。 // 读 SQLiteDatabase readableDatabase = helper.getReadableDatabase(); // 写 // SQLiteDatabase writableDatabase = helper.getWritableDatabase(); } }
数据线连接到手机,开启开发者调试也可以找到:
注意:因为,SQLiteOpenHelper的onCreate只会加载一次,并且如果发现该数据库已经创建就不会在执行了。因此,修改了sqlite的数据库内容,再次加载前一定要删除对应databases目录下的内容。
SqliteOpenHelper 实现 增删改查效果:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical"> <Button android:text="生成DB文件" android:onClick="createDB" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:text="查询" android:onClick="query" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:text="插入" android:onClick="insert" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:text="修改" android:onClick="update" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:text="删除" android:onClick="delete" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
MySqliteOpenHelper
package com.example.sqlitetest; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import androidx.annotation.Nullable; /** * MySqliteOpenHelper 工具类 单例模式(1.构造函数私有化,2.对外提供函数。) */ // 该类就可以理解为一个数据库了。 public class MySqliteOpenHelper extends SQLiteOpenHelper { // 单例模式 private static SQLiteOpenHelper mInstance; // 提供对外提供的函数。 public static synchronized SQLiteOpenHelper getInstance(Context context){ if (mInstance == null){ mInstance = new MySqliteOpenHelper(context,"itholmes.db",null,1); } return mInstance; } /** * 通过构造函数,将数据库名称 , 数据库版本号等定义出来。因此,必须要声明一个构造函数。 * @param context context就是环境,在此环境下进行创建数据库。 * @param name 数据库名称 * @param factory 工厂 * @param version 版本 数据库升级后需要不断加1操作! */ public MySqliteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } /** * 数据库初始化用的: * 创建表 表数据初始化 数据库第一次创建的时候调用。第二次发现有该表了就不会重复创建了! * 此函数只会执行一次。 因此,添加了新的数据库或者修改了数据库,必须要对应项目目录将databases目录下的db等文件删除。 * @param sqLiteDatabase */ @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { // 创建表:person表。 // 主键: _id(标准) 或者 id(不标准) 必须唯一,也可以添加自动增长 。 String sql = "create table persons(" + "_id integer primary key autoincrement," + "name text" + ")"; // 执行sql sqLiteDatabase.execSQL(sql); } // 数据库升级用的 @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } }
MainActivity
package com.example.sqlitetest; import androidx.appcompat.app.AppCompatActivity; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.os.Bundle; import android.util.Log; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // 生成DB文件 public void createDB(View view){ // 通过MySqliteOpenHelper来操作 SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this); // databases数据库文件的创建,靠下面这句话。 // 读 SQLiteDatabase readableDatabase = helper.getReadableDatabase(); // 写 // SQLiteDatabase writableDatabase = helper.getWritableDatabase(); } // sql 查询语句 public void query(View view){ // helper单例模式,因此随便调用。 SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this); // 查询调用getReadableDatabase就行。 SQLiteDatabase db = helper.getReadableDatabase(); // db.isOpen():如果db数据库是打开的,就返回true,反之返回false。 if (db.isOpen()){ // rawQuery方法进行查询,并且返回了一个Cursor游标。 Cursor cursor = db.rawQuery("select * from persons", null); // 迭代游标 // cursor.moveToNext()就是让游标下移,遍历数据。 while (cursor.moveToNext()){ // 可以直接通过索引获取。 // int anInt = cursor.getInt(0); // 也可以通过cursor.getColumnIndex("_id")这种形式来获取,容错率大一点。 int id = cursor.getInt(cursor.getColumnIndex("_id")); String name = cursor.getString(cursor.getColumnIndex("name")); Log.d("itholmes","_id:"+ id + ",name" + name); } // 一定记得关闭游标,否则耗费性能! cursor.close(); // 数据库也要关闭! db.close(); } } public void insert(View view) { // helper单例模式,因此随便调用。 SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this); // 增删改都需要调用getWritableDatabase SQLiteDatabase db = helper.getWritableDatabase(); if (db.isOpen()){ // 插入语句 String sql = "insert into persons(name) values ('张三')"; db.execSQL(sql); } // 关闭数据库 db.close(); } // 修改 public void update(View view) { // helper单例模式,因此随便调用。 SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this); // 增删改都需要调用getWritableDatabase SQLiteDatabase db = helper.getWritableDatabase(); if (db.isOpen()){ String sql = "update persons set name = ? where _id = ?"; // 添加参数 db.execSQL(sql,new Object[]{"李四",1}); } db.close(); } // 删除 public void delete(View view) { // helper单例模式,因此随便调用。 SQLiteOpenHelper helper = MySqliteOpenHelper.getInstance(this); // 增删改都需要调用getWritableDatabase SQLiteDatabase db = helper.getWritableDatabase(); if (db.isOpen()){ String sql = "delete from persons where _id = ?"; db.execSQL(sql,new Object[]{1}); } db.close(); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。