目录
2、右击app/src/main目录-》New-》Directory,创建一个assets目录,闯进一个litepal.xml文件
9、如果要使用原生态的SQL则需要百度以下哈,这里就先不总结了
一、使用SQLiteOpenHelper操作数据库
SQLite数据库支持:INTEGER , REAL(浮点型) , TEXT(字符串文本),NULL(零)五种数据类型
---------------------------------------
1、数据库的创建:
public class MyHelper extends SQLiteOpenHelper{
public MyHelper(Context context){
super(context,"数据库名.db",null,1);
}
//仅在第一次创建DB时调用,之后更新数据库时,可以调用onCreate()
public void onCreate(SQLiteDatabase db){
db.execSQL("建表SQL");
}
public void onUpgrade(SQLiteDatabase db , int oldVersion,int newVersion){
//db.exeSQL();
//db.exeSQL();
//onCreate(db);
}
}
---------------------------------------
2、升级数据库:
1)在onUpdate()方法中执行DROP语句,把所有已存在的表删除掉,
然后再次调用onCreate()方法重新创建数据库【注意如果没把已经存在的表
删除掉,再创建表时系统会发现此张表已经存在,就会直接报错】
例子:
public static final String CREATE_ BOOK = "create table Book ("
+ "id integer primary key autoincrement,
+ "author text,
+ "price real,
+ "pages integer,
+"nametext)";
public static final String CREATE_ CATEGORY = "create table Category ("
+ "id integer primary key autoincrement,
+ "category_ name text, "
+ "category_ code integer)";
public void onUpgrade(){
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
2)如何让onUpgrade()方法得到执行?
通过SQLiteOpenHelper的构造方法里的第四个参数【当前数据库的版本号】
之前我们传递的是1,现在我们传递一个1大的数,就可以然onUpgrade()方法执行了
举例:
dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,2);//拿到对象
dbHelper.getWritableDatabase();//创建和升级数据库
---------------------------------------
2、创建/拿到数据库对象:
SQLiteOpenHelper中还有两个非常重要的实例方法: getReadableDatabase()和 get-
WritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已在在则
直接打开,否刚创建一个新的数据库)并返回一个可对数据库进行读写操作的对象。
不同的是,当数据库不可写人的时候(如磁盘空间已满), getReadableDatabase()方法返回的对象将以只
读的方式去打开数据库,面getWritableDatabase()方法则将出现异常。
---------------------------------------
3、增删改查CRUD
要点:
SqlLiteOpenHelper的getReadableDatabase()和getWritableDatabase()方法会返回一个SQLiteDatabase对象,
借助这个对象做数据的CRUD操作。
添加数据(insert):
SQLiteDatabase db=helper.getWritableDatabase();
//创建ContentValue对象,提供了一系列的put方法
ContentValues values = new ContentValues();
values.put("name",“zz");
values.put("price",26);
//参数:表名,未指定添加数据的列自动赋的值,ContentValue对象
db.insert("表名",null,values);
db.close();
修改数据(upgrade):
SQLiteDatabase db=helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price",26);
//参数:表名,ContentValue对象,更新那些行,约束条件【不指定第3,4个参数,默认所有行】
db.update("表名",values,"name=?",new String[]{"zzl"});
db.close();
删除数据(delete):
SQLiteDatabase db=helper.getWritableDatabase();
//参数:表名,删除那些行,约束条件【不指定2,3参数,默认删除所有行】
db.delete("表名",”name=?“,new String[]{"zzl"});
db.close();
查询数据(query):
SQLiteDatabase db=helper.getWritableDatabase();
//参数:看书吧!挺多的【这里建议直接写SQL清楚】
//返回一个Cursor对象,查询到的所有数据都将从Cursor对象中取出
Cursor cursor = db.query("表名",name,"name=?",new String[]{},null,null,null);
if(cursor.moveToFirst()){//将数据指针移动到首行位置
do{
//getColumnIndex()方法获取某一列在表中对应位置的索引,传入到取值方法中
//取String型数据
String name = cursor.getString(cursor.getColumnIndex("name");
//取Int型数据
int price = cursor.getInt(cursor.getColumnIndex("price");
//取double型数据
double age = cursor.getDouble(cursor.getColumnIndex("age:);
}while(cursor.moveToNext())//
}
//关闭cursor
cursor.close();
db.close();
--------------------------------------
注意:
进行增删改查操作时,都需要SQLiteDatabase对象,所以要在对数据库访问完后,再close掉这个对象,不然期间还需要再 重新拿对象
----------------------------------
最后:如果想直接用SQL干的话,看下面--》
添加数据:
db.exeSQL("insert into Book(name,author,pages,price) values(?,?,?,?) new String[]{"三国演义","罗贯中","166",“16.6”}");
更新数据:
db.exeSQL("update Book set price=? where name=?" new String[]{"26.3","飞虎传"});
删除数据:
db.exeSQL(“delete from Book where pages>?”,new String[]{"500"});
查询数据:
db.rawQuery("select * from Book",null);
二、使用LitePal操作数据库
介绍:LitePal是一个开源库,采用了对象关系映射模式,
特点:不用编写SQL语句,对CURD进行了封装,集成了:建表,CRUD操作
1、配置:
dependencies:
implementation 'org.litepal.android:core:1.6.1'
AndroidManifest.xml:
<application
android:name="org.litepal.LitePalApplication"
...>
2、右击app/src/main目录-》New-》Directory,创建一个assets目录,闯进一个litepal.xml文件
编辑litepal.xml文件内容:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
//数据库名
<dbname value="cool_weather"/>
//版本号【建议从1开始,这里由于调试了两次程序,所以增到了3】
<version value="3"/>
//所有表的映射模型【一定要用完整的类名】
<list>
<mapping class="com.coolweather.android.db.province"/>
<mapping class="com.coolweather.android.db.city"/>
<mapping class="com.coolweather.android.db.county"/>
</list>
</litepal>
4、升级数据库
由于LitePal采用ORM模式,也就是对象关系映射,就是用面向对象的思维来操作数据库
1)所有的表,都需要新建模型类,继承DataSupport类【之后所有的CRUD的方法都是从DataSupport继承来】
2) 若需要该现有表的结构,就直接修改对应的模型类的域属性
3)若新增表,就直接新建模型类,然后将它添加到映射模型列表中
5、新增数据(save)
1)创建模型类实例对象,调用setxxx()方法对数据进行设置
2)实例对象调用save()方法完成添加操作
6、更新数据
//之前的SQLOpenHelper方法,是直接删除掉所有的表重新创建,这是十分不推荐的
第一种:可以新建实例对象,调用set方法,再次调用save方法对原有的数据项进行重写
第二种:举例:
Book book = new Book();
book.setPrice(14.95);//价格
book.setPress("Anchor");//出版社
book.setTODefalut("pages");//pages字段的值更新为默认值
book.updataAll("name=? and author=?","三国演义,"罗贯中");
7、删除数据
举例:
DataSupport.deleteAll(Book.class,"price<?","15");
如果不指定约束条件,就删除表中所有数据,这一点和updateAll一样
8、查询数据
//之前之前的SQLOpenHelper方法,会出现query("book",null,null,null,...)一大堆null,会让人头疼
//但是也不得不传null
使用Litepal查询:DataSupport.findAll(Book.class);返回值是List集合,也就是不用通过Cursor对象,一行行
地取值了,litepal自动帮我们完成了赋值操作
补充:
* 查询第一条数据:findFirst(Book.class);
* 查询最后一条数据:findLast(Book.class);
通过连缀查询定制查询功能:
* 查询哪几列的数据select("name","author","pages")
* 新增约束条件where("pages>?","400")
* 指定结果排序方式order("pages desc") //写asc或者不写表示升序排列
* 指定结果数量limit(10)
* 指定查询结果的偏移量offset(10)
以下大妈表示:查询Book表中第11~20条满足:页数>400这个条件的name,author和pages这3列数据,并将结果按pages升排列
List<Book> books = DataSupport.select("name","author","pages")
.where("pages>?","400")
.order("pages")
.limit(10)
.offset(10)
.find(Book.class);
9、如果要使用原生态的SQL则需要百度以下哈,这里就先不总结了
-------------------------------
最后总结:
还是推荐使用LitePal方式,为什么啊?
- 该表结构,增加表很容易
- 我们不需要写建表SQL呀!
- CRUD都有了很好的封装【尤其是查询】