Android使用SQLite数据库的示例

作者:这个杀手不太累 时间:2023-09-17 07:36:58 

一. 简介

SQLite数据库是一个轻量级的DBMS(数据库管理系统)。SQLite使用单个文件存储数据,Android标准库包含SQLite库以及配套使用的一些Java辅助类。主要特点:轻量级,单一文件,跨平台,开源。

二. Android中SQLite数据库的使用

1、创建SQLite数据库


SQLiteDatabase db=
SQLiteDatabase.openOrCreateDatabase(
"/data/data/" + getPackageName() + "/test.db",
null);

执行完这条语句,可以在adb shell下进入/data/data/package-name/下看到刚才创建的数据库文件

Android使用SQLite数据库的示例 

在Android中使用SQLiteDatabase的静态方法
openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)打开或者创建一个数据库。

它会自动去检测是否存在这个数据库,如果存在则打开,反之不存在就创建一个数据库;创建成功则返回一个SQLiteDatabase对象,失败抛出FileNotFoundException异常。

除了以上方法,Android还提供了SQLiteOpenHelper这个类来创建数据库,首先继承SQLiteOpenHelper,重写onCreate和onUpgrade方法及构造方法


public class MySqliteHelper extends SQLiteOpenHelper{

public MySqliteHelper(Context context) {
 super(context, "mysqlite.db", null, 1);
 //传入四个参数
 //第一个参数context 上下文对象
 //第二个参数mysqlite.db 数据库名称(文件名)
 //第三个参数一般为null
 //第四个参数数据库版本号,这里写1
}

@Override
public void onCreate(SQLiteDatabase db) {
 /* 数据库创建的时候会回调此方法,可以用db对象执行SQL语
  * 句,创建所需要的表
  */
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//当数据库升级时调用此方法
}
}

接着在需要创建数据库的时候调用


SQLiteOpenHelper dbHelper = new MySqliteHelper(this);
SQLiteDatabase db = dbHelper.getWritableDatabase();

使用SQLiteOpenHelper创建的数据库,保存在/data/data/package-name/databases/目录下,通过adb shell可以看到创建的数据库文件

Android使用SQLite数据库的示例

2、创建数据库中的数据表

数据库创建完成后,要创建保存数据的表,表是存放在数据库中的。示例代码入下


 private void createTable(SQLiteDatabase db){
   //SQL语句
   String sql =
   "create table stutable(_id integer primary key autoincrement,name text,age integer)";
   db.execSQL(sql);
 }

这里附上SQLite数据类型

NULL: 这个值可为空值

VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。

CHAR(n):长度固定为n的字串,n不能超过 254。

INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8….

REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.

TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).

BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改变格式。

DATA :包含了 年份、月份、日期

执行完上述语句,可以通过ADM将数据库文件导出到电脑上

Android使用SQLite数据库的示例 

通过可视化工具打开数据库文件可以看到之前创建的表,以及定义的表字段

 Android使用SQLite数据库的示例

除了执行定义创建表的方法外,还可以在继承SQLiteOpenHelper类中的onCreate方法来初始化表结构,在后面的例子使用继承SQLiteOpenHelper方式创建表。

3、对表进行操作(数据表的增删改查)

增:在表中增加数据,可以使用SQLiteDatabase类中提供的execSQL(String sql)执行一条插入数据的SQL语句来插入数据,不过,AndroidSQLiteDatabase类提供了更为简单的方法来执行插入数据操作


 //SQLiteDatabase类中提供的方法
 public long insert(
    String table,//要操作表名
    String nullColumnHack,//空列的默认值
    ContentValues values
//ContentValues封装了列名称和列值的Map
    );

private void insertToTable(SQLiteDatabase db){
   ContentValues cv = new ContentValues();
   cv.put("name","wxq");
   cv.put("age",11);
   db.insert("stutable",null,cv);
 }

执行insertTable方法,再次导出数据库可以看到stutable表中增加了一条数据

Android使用SQLite数据库的示例

删:好吧,刚插入一条数据。。。

同样Android提供了delete方法


 //SQLiteDatabase类中提供的方法
 public int delete(
     String table,//表名称
     String whereClause,//删除条件
     String[] whereArgs); //删除条件值数组

private void deleteToTable(SQLiteDatabase db){
   //删除条件,这里以name为条件,也可以是age = ?
   String whereClasuse = "name = ?";
   //删除条件参数,
   String[] whereArgs = new String[]{"wxq"};
   //执行删除
   db.delete("stutable",whereClasuse,whereArgs);
 }

执行上述语句,将会删除stutable表中刚才插入的数据。

改:


 //SQLiteDatabase类中提供的方法
 public int update(
 //表名称
 String table,
 //和行列ContentValues键值对应的key-value
 ContentValues values,
 //更新条件
 String whereClause,
 //更新条件数组
 String[] whereArgs
 );

private void updateToTable(SQLiteDatabase db){
   //实例化ContentValues
   ContentValues cv= new ContentValues();
   cv.put("age",23);
   //更新条件
   String whereClause = "name = ?";
   //更新条件数组
   String[] whereArgs = new String[]{"wxq"};
   db.update("stutable",cv,whereClause,whereArgs);
 }

执行完更新语句,导出数据库文件,在可视化工具中查看

Android使用SQLite数据库的示例

查:在Android中查询数据是通过Cursor类来实现的,可以使用SQLiteDatabase.query()方法时,这里使用别一个方法rawQuery


 public Cursor rawQuery(
 String sql,//查询的SQL语句
 String[] selectionArgs//当SQL语句中含有?,这里代表值
 );

public void queryToTable(SQLiteDatabase db){
   String sql = "select * from stutable";//全查
   Cursor c = db.rawQuery(sql,null);//这里会返回一个Cursor(游标)对象
 }

Android使用SQLite数据库的示例

使用SQLite的一个Demo(英雄管理系统)

Android使用SQLite数据库的示例 

主要操作数据库的代码


public class HeroSqliteManager {
 private SQLiteOpenHelper dbHelper;
 private SQLiteDatabase db;
 private static HeroSqliteManager instance;

private static final String TABLE_NAME = "hero";
 private static final String NAME_FIELD = "name";
 private static final String ICOID_FIELD = "icoId";
 private static final String ATTACK_FIELD = "attack";
 private static final String DEFENSE_FIELD = "defense";

public static HeroSqliteManager getInstance() {
   if (instance == null) {
     synchronized (HeroSqliteManager.class) {
       if (instance == null) {
         instance = new HeroSqliteManager();
       }
     }
   }
   return instance;
 }

private HeroSqliteManager() {
   dbHelper = new HeroSqliteHelper(HeroApplication.getContext());
   db = dbHelper.getWritableDatabase();
 }

/**
  * 插入记录
  * @param hero
  */
 public void insertData(Hero hero) {
   ContentValues cv = new ContentValues();
   cv.put(NAME_FIELD, hero.name);
   cv.put(ICOID_FIELD, hero.icoId);
   cv.put(ATTACK_FIELD, hero.attack);
   cv.put(DEFENSE_FIELD, hero.defense);
   db.insert(TABLE_NAME, null, cv);
 }

/**
  * 删除记录
  * @param
  */
 public void deleteData(int id) {
   String whereClasuse = "_id = ?";
   String[] whereArgs = new String[]{String.valueOf(id)};
   db.delete(TABLE_NAME, whereClasuse, whereArgs);
 }

/**
  * 修改记录
  * @param hero
  */
 public void updateData(Hero hero) {
   ContentValues cv = new ContentValues();
   cv.put(NAME_FIELD, hero.name);
   cv.put(ICOID_FIELD, hero.icoId);
   cv.put(ATTACK_FIELD, hero.attack);
   cv.put(DEFENSE_FIELD, hero.defense);
   String whereClasuse = "_id = ?";
   String[] whereArgs = new String[]{String.valueOf(hero.id)};
   db.update(TABLE_NAME, cv, whereClasuse, whereArgs);
 }

/**
  * 查询所有的英雄
  * @return
  */
 public List<Hero> selectData() {
   List<Hero> heroList = new ArrayList<>();
   Cursor c = db.rawQuery("select * from " + TABLE_NAME, null);
   while (c.moveToNext()) {
     Hero hero = new Hero();
     hero.id = c.getInt(c.getColumnIndex("_id"));
     hero.name = c.getString(c.getColumnIndex(NAME_FIELD));
     hero.icoId = c.getInt(c.getColumnIndex(ICOID_FIELD));
     hero.attack = c.getInt(c.getColumnIndex(ATTACK_FIELD));
     hero.defense = c.getInt(c.getColumnIndex(DEFENSE_FIELD));
     heroList.add(hero);
   }
   c.close();
   return heroList;
 }

/**
  * 按name查询
  * @param name
  * @return
  */
 public Hero selectForName(String name) {
   Cursor c = db.rawQuery("select * from " + TABLE_NAME + " where name = ?", new String[]{name});
   Hero hero = null;
   if (c.moveToNext()) {
     hero = new Hero();
     hero.id = c.getInt(c.getColumnIndex("_id"));
     hero.name = c.getString(c.getColumnIndex(NAME_FIELD));
     hero.icoId = c.getInt(c.getColumnIndex(ICOID_FIELD));
     hero.attack = c.getInt(c.getColumnIndex(ATTACK_FIELD));
     hero.defense = c.getInt(c.getColumnIndex(DEFENSE_FIELD));
   }
   c.close();
   return hero;
 }

public void destroy() {
//    if (db != null) {
//      db.close();
//    }
//    db = null;
 }
}

SQLiteDemo  

来源:http://blog.csdn.net/zhe_ge_sha_shou/article/details/54566123

标签:android,sqlite
0
投稿

猜你喜欢

  • Java代理模式与动态代理之间的关系以及概念

    2022-03-15 18:05:34
  • java显示当前运行时的参数(java运行参数)

    2023-09-07 10:03:22
  • android中SwipeRefresh实现各种上拉,下拉刷新示例

    2022-06-14 17:18:03
  • 一篇文章轻松搞懂Java中的自旋锁

    2023-06-29 00:00:36
  • Java SimpleDateFormat与System类使用示例详解

    2021-10-25 23:15:55
  • java 文件流的处理方式 文件打包成zip

    2022-07-08 12:43:03
  • Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解

    2023-02-01 16:23:30
  • C#中实现一次执行多条带GO的sql语句实例

    2023-07-12 10:23:53
  • Java Exception 捕获和显示实例详解

    2022-07-05 22:41:09
  • 解析C#多线程编程中异步多线程的实现及线程池的使用

    2021-10-23 02:36:23
  • java实现人工智能化屏幕监控窗口

    2022-09-16 18:09:19
  • spring mvc中直接注入的HttpServletRequst安全吗

    2021-12-29 07:48:16
  • Android滑动拼图验证码控件使用方法详解

    2021-10-03 02:56:06
  • 简单了解Java字符串(操作)

    2022-04-22 18:37:29
  • SpringBoot中异常处理实战记录

    2022-07-21 20:39:01
  • 深入探索Java常量池

    2022-12-28 00:55:53
  • Android中Shape的用法详解

    2023-12-21 14:05:44
  • Java中使用Lambda表达式和函数编程示例

    2022-05-06 03:30:40
  • Flutter WebView 预加载实现方法(Http Server)

    2023-06-25 23:14:35
  • 浅谈C#泛型的用处与特点

    2022-04-22 02:39:35
  • asp之家 软件编程 m.aspxhome.com