android sqlite 单例模式,安卓SQLite基础使用指南

本文详细介绍了如何在 Android 中使用 SQLite 进行数据库操作,包括创建数据库、升级数据库、执行 CRUD 操作以及注意事项,如自增长主键和默认值设置。同时,展示了如何通过 SQLiteOpenHelper 创建和升级数据库,并提供了数据库操作的封装示例。
摘要由CSDN通过智能技术生成

零、前言

[1]熟悉MySQL的学这个就像会西瓜的人去学吃哈密瓜一样简单。

[2]如果对MySQL不太熟悉的童鞋,可以看一下我的这篇:SpringBoot-14-MyBatis预热篇,MySQL小结

[3]SQLite:安卓内置轻量级的关系型数据库

[4]强烈建议语句什么的提前写好,在MySQL上测试一下,不然少个分号,多个逗号什么的就呵呵了

[5]安卓有API支持数据库操作,但感觉不怎么灵活,感兴趣的可以自己了解一下

坑点

[1]:SQLite 不支持 DEFAULT 和 NOT NULL 连用(虽然连在一起也没啥用)

[3]:INSERT INTO 的 INTO 要加上 (MySQL养成的坏毛病,得该)

一、创建数据库

1.SQL常量类:SQLCon.java

/**

* 作者:张风捷特烈

* 时间:2018/8/26 0026:14:48

* 邮箱:1981462002@qq.com

* 说明:SQL常量类

*/

public class SQLCon {

/**

* 数据库名

*/

public static String DB_NAME = "weapon";

/**

* 数据库版本

*/

public static int DB_VERSION = 1;

/**

* 建表语句

*/

public static final String CREATE_TABLE = "CREATE TABLE sword (\n" +

"id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n" +

"name VARCHAR(32) NOT NULL,\n" +

"atk SMALLINT UNSIGNED NOT NULL,\n" +

"hit SMALLINT UNSIGNED NOT NULL DEFAULT 20,\n" +

"crit SMALLINT UNSIGNED NOT NULL DEFAULT 10\n" +

");";

}

2.SQLiteOpenHelper使用:我的数据库辅助类

/**

* 作者:张风捷特烈

* 时间:2018/8/26 0026:14:26

* 邮箱:1981462002@qq.com

* 说明:我的数据库辅助类

*/

public class MySQLHelper extends SQLiteOpenHelper {

private Context mContext;

/**

* 构造函数

*

* @param context 上下文

*/

public MySQLHelper(Context context) {

super(context, SQLCon.DB_NAME, null, SQLCon.DB_VERSION);

mContext = context;

}

/**

* 创建数据库,数据库存在就不会执行

*

* @param db SQLite数据库对象

*/

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL(SQLCon.CREATE_TABLE);//创建表

}

/**

* 数据库进行升级

*

* @param db SQLite数据库对象

* @param oldVersion 旧版本

* @param newVersion 新版本

*/

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

}

3.在需要的地方使用:

MySQLHelper mySQLHelper = new MySQLHelper(this);//创建辅助对象

mySQLHelper.getWritableDatabase();//获取可写数据库对象

//getReadableDatabase()和getWritableDatabase()

//这两个方法都可以创建或打开一个现有的数据库,并返回一个可对数据库进行读写操作的对象。

//磁盘空间已满时getWritableDatabase()异常

1460000018964858

二、升级数据库时删除表

1.SQL常量类,将数据库版本改到2:SQLCon.java

/**

* 数据库版本

*/

public static int DB_VERSION = 2;

/**

* 删除表语句

*/

public static final String DROP_TABLE = "DROP TABLE sword";

2.com.toly1994.si_sqlite.MySQLHelper#onUpgrade

db.execSQL(SQLCon.DROP_TABLE);

L.d(oldVersion+":"+newVersion+L.l());//1:2

3.在需要的地方使用

MySQLHelper mySQLHelper2 = new MySQLHelper(this);//创建辅助对象

mySQLHelper2.getWritableDatabase();//获取可写数据库对象

三、数据库的常用操作(CRUD):

1.插入数据(C)

/**

* 插入语句

*/

public static final String INSERT = "INSERT INTO sword(id,name,atk,hit,crit) VALUES" +

"(1,'痕兮',7000,800,999)," +

"(2,'逐暮',100,1000,10000)," +

"(3,'风跃',9000,10,255);";

mDb = new MySQLHelper(this).getWritableDatabase();

mDb.execSQL(SQLCon.INSERT);

1460000018964859

2.删除数据

/**

* 删除数据

*/

public static final String DELETE = "DELETE FROM sword WHERE id=1;";

mDb = new MySQLHelper(this).getWritableDatabase();

mDb.execSQL(SQLCon.DELETE);

1460000018964860

3.修改数据

/**

* 修改数据

*/

public static final String UPDATE = "UPDATE sword SET hit=hit+1;";

mDb = new MySQLHelper(this).getWritableDatabase();

mDb.execSQL(SQLCon.UPDATE);

1460000018964861

4.查询数据

1.查询所用

Cursor cursor = mDb.rawQuery("SELECT * FROM sword", null);

while (cursor.moveToNext()) {

String id = cursor.getString(cursor.getColumnIndex("id"));

String name = cursor.getString(cursor.getColumnIndex("name"));

String atk = cursor.getString(cursor.getColumnIndex("atk"));

String hit = cursor.getString(cursor.getColumnIndex("hit"));

String crit = cursor.getString(cursor.getColumnIndex("crit"));

System.out.println(id + "---" + name + "---" + atk + "---" + hit + "---" + crit);

}

//2---逐暮---100---1001---10000

//3---风跃---9000---11---255

cursor.close();//关闭游标

2.查询一个:?为占位符,后面String数组对应站位符位置,占位符可多个。

Cursor cursor2 = mDb.rawQuery("SELECT * FROM sword WHERE id = ?", new String[]{"2"});

while (cursor2.moveToNext()) {

String id = cursor2.getString(cursor2.getColumnIndex("id"));

String name = cursor2.getString(cursor2.getColumnIndex("name"));

String atk = cursor2.getString(cursor2.getColumnIndex("atk"));

String hit = cursor2.getString(cursor2.getColumnIndex("hit"));

String crit = cursor2.getString(cursor2.getColumnIndex("crit"));

System.out.println(id + "---" + name + "---" + atk + "---" + hit + "---" + crit);

}

//2---逐暮---100---1001---10000

cursor2.close();//关闭游标

四、其他知识点

1.关于主键自增长和字段默认值

/**

* 建表语句

*/

public static final String CREATE_TABLE = "CREATE TABLE sword (\n" +

"_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n" +

"name VARCHAR(32) NOT NULL,\n" +

"atk SMALLINT UNSIGNED DEFAULT 1000,\n" +

"hit SMALLINT UNSIGNED DEFAULT 20,\n" +

"crit SMALLINT UNSIGNED DEFAULT 10\n" +

");";

2.可以将常用操作封装到一个dao类中

/**

* 作者:张风捷特烈

* 时间:2018/8/26 0026:17:50

* 邮箱:1981462002@qq.com

* 说明:数据库操作类

*/

public class SwordDao {

private static SwordDao sSwordDao;

private SQLiteDatabase db;

/**

* 私有化构造函数

*/

private SwordDao() {

}

/**

* 单例模式获取SwordDao

*

* @return SwordDao

*/

public static SwordDao get() {

if (sSwordDao == null) {

synchronized (SwordDao.class) {

if (sSwordDao == null) {

sSwordDao = new SwordDao();

}

}

}

return sSwordDao;

}

public SwordDao attach(SQLiteDatabase db) {

this.db = db;

return this;

}

/**

* 查询所有

* @return

*/

public List findAll() {

Cursor cursor = db.rawQuery("SELECT * FROM sword", null);

List swords = new ArrayList<>();

while (cursor.moveToNext()) {

String tempId = cursor.getString(cursor.getColumnIndex("_id"));

String name = cursor.getString(cursor.getColumnIndex("name"));

String tempAtk = cursor.getString(cursor.getColumnIndex("atk"));

String tempHit = cursor.getString(cursor.getColumnIndex("hit"));

String tempCrit = cursor.getString(cursor.getColumnIndex("crit"));

int id = tempId == null ? -1 : Integer.parseInt(tempId);

int atk = tempAtk == null ? -1 : Integer.parseInt(tempAtk);

int hit = tempHit == null ? -1 : Integer.parseInt(tempHit);

int crit = tempCrit == null ? -1 : Integer.parseInt(tempCrit);

Sword sword = new Sword(name, atk, hit, crit);

sword.setId(id);

swords.add(sword);

}

cursor.close();//关闭游标

return swords;

}

/**

* 插入

* @param sword

*/

public void insert(Sword sword) {

db.execSQL("INSERT INTO sword(name,atk,hit,crit) VALUES(?,?,?,?)",

new String[]{

sword.getName(), sword.getAtk() + "", sword.getHit() + "", sword.getCrit() + ""});

}

/**

* 插入一个剑名称,其他默认

*

* @param name 名称

*/

public void insert(String name) {

db.execSQL("INSERT INTO sword(name) VALUES(?)",

new String[]{name});

}

}

后记:捷文规范

1.本文成长记录及勘误表

项目源码

日期

备注

V0.2--无

2018-10-23

增加其他知识点

2.更多关于我

笔名

QQ

微信

爱好

张风捷特烈

1981462002

zdl1994328

语言

3.声明

1----本文由张风捷特烈原创,转载请注明

2----欢迎广大编程爱好者共同交流

3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正

4----看到这里,我在此感谢你的喜欢与支持

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值