android数据库

*******SQLite的基本语句
//创建表
create table student(_id integer primary key autoincrement,
                     name varchar(64),address text,age integer)
//插入数据
insert into student(name,address,age) values("xiaoming","address",18) 
insert into student(name,address,age) values("laowang","gebi",45)
insert into student(name,age) values("xiaohong",19)
//删除数据
delete from student where _id = 1 
delete from studnet where name = "xiaoming"
//查询数据
select * from student
select name,age from student where _id=10
select count(*) from student 查询表格有多少行数据
select * from table limit offset,length    offset查询开始的行下标,length查询的条数
//更新数据
update student set age = 20 where name = "xiaohong"
//删除表
drop table if exists student


设置数据库
创建完数据库后,为了更安全而有效地使用它,我们还需要对它进行一定的配置,主要的方法有3个,分别是:
(1)设置本地化:
db.setLocale(Locale.getDefault());
(2)设置线程安全锁:
db.setLockingEnabled(true);
(3)设置版本:
db.setVersion(1);
4.关闭数据库
当我们不再需要使用数据库时可以考虑将其关闭,关闭的方法非常简单,只需要调用方法:
db.close();
5.删除数据库
有些时候基于某种需求我们需要将数据库彻底删除,方法同样非常简单:
Context.deleteDatabase();


1、创建 SQLite 数据库对象:SQLiteDatabase对象代表一个数据库。 SQLiteDatabase提供了几个静态方法来打开一个文件对应的数据库。
//当数据库不存在时:
String path = SDCardHelper.getSDCardRoot() + File.separator + "steven" + File.separator + "words.db";
static  SQLiteDatabase  openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags, DatabaseErrorHandler errorHandler)
static  SQLiteDatabase  openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags)
static  SQLiteDatabase  openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler)
static  SQLiteDatabase  openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)
【备注:】打开数据库的参数:
1、SQLiteDatabase的构造方法是private,(单例模式吗?)所以只能通过openDatabase()来连接数据库;
2、参数中的path代表着数据库的路径(如果是在默认路径/data/data/<package_name>/databases/下,则这里只需要提供数据库名称);
3、factory代表着在创建Cursor对象时,使用的工厂类,如果为null的话,则使用默认的工厂(这里我们可以实现自己的工厂进行某些数据处理);
4、flags代表的是创建表时的一些权限设置,多个权限之间用|分隔:
OPEN_READONLY :代表的是以只读方式打开数据库(常量值为:1)
OPEN_READWRITE:代表以读写方式打开数据库(常量值为:0)
CREATE_IF_NECESSARY:当数据库不存在时创建数据库
NO_LOCALIZED_COLLATORS:打开数据库时,不根据本地化语言对数据库进行排序(常量值为:16)


存到外部sd卡上,需要加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>


**************android中的sqlite基本应用


onCreate()在第一次创建数据库的时候会调用的方法,一般在这个方法中创建表和初始化表数据。
只运行一次,要想再次运行,
第一种:就把数据库文件夹删掉,或者卸载程序
第二种:升级版本号,在onUpgrade()方法中调用onCreate()方法


1.创建数据库的帮助类继承SQLiteOpenHelper
*数据库的帮助类
 *要创建数据库的话,就必须先创建数据库的帮助类
 */
public class MyHelp extends SQLiteOpenHelper{
//构造方法
public MyHelp(Context context, String name, CursorFactory factory,
int version) {
super(context, //创建数据库的上下文对象
name, //数据库的名字
factory, //游标工厂,一般为null
version);//数据库的版本号,最小的版本号是1.版本升级的时候,版本号只能增加,不能减小
}
//在第一次创建数据库的时候会调用的方法,一般在这个方法中创建表和初始化表数据
//注意:数据库创建成功后,才会调用这个方法,不是调用这个方法去创建数据库
//db数据库对象,可以用这个数据库对象来执行sql语句
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("info", "-----onCreate-----");
String sqlStr = "create table student(_id integer primary key autoincrement,name varchar(64),address text,age integer)";
//sql语句,创建表
db.execSQL(sqlStr);
}
//数据库的版本更新的时候,就会被调用。一般在这个方法中创建新表,删除旧表
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion>oldVersion) {
db.execSQL("drop table if exists student");
onCreate(db);
}
}


2.在mainactivity中创建帮助类的对象
myHelp = new MyHelp(this, "Second.db", null, 1);


也可以这样写
public PersonHelper(Context context) {
super(context, DB_NAME, null, 1);
}


helper = new PersonHelper(this);


3.获取到一个可读可写的数据库对象
db = myHelp.getWritableDatabase();


//获取到一个可读可写的数据库对象,只是在一些意外情况(比如磁盘满了),这时的数据库就变成只读的数据库
db = myHelp.getReadableDatabase();


********db.execSQL(sql),自己写数据库语言进行操作


4.完成后就可以进行数据读写了
db.execSQL(sql);里边是数据库基本语法语言
db.execSQL(sql, bindArgs):里边是数据库基本语法语言,第二个参数是new object[]数组


//sql语句,创建表
String sqlStr = "create table student(_id integer primary key autoincrement,
name varchar(64),address text,age integer)";
db.execSQL(sqlStr);


//删除表
db.execSQL("drop table if exists student");


//插入数据到数据库
db.execSQL("insert into student(name,age) values('name1',19)");
db.execSQL("insert into student(name,age) values(?,?)", new Object[]{"name2",20});


//修改数据库中的数据
db.execSQL("update student set age = 100 where _id=10");
db.execSQL("update student set name = ? where _id=?", new Object[]{"小丽",1});


//删除数据
db.execSQL("delete from student where name='name8'");
db.execSQL("delete from student where name = ?", new Object[]{"name9"});


//查询数据库的内容
db.rawQuery(sql, selectionArgs);
Cursor cursor = db.rawQuery("select name from student where age = ?", new String[]{22+""});
//cursor.moveToNext():得到带有数据的游标之后,向后移动。如果后面有数据,返回true。反之,返回false。
//cursor.getString(0):获取到cursor的一行数据的列的下标是0的数据
//cursor.getInt(1):获取到cursor的一行数据的列的下标是1的数据
//cursor.getInt(cursor.getColumnIndex("_id")):获取到对应字段名的列号


//获取查询到的数据
Cursor cursor = db.rawQuery("select * from student", null);
while(cursor.moveToNext()){
int _id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));

Log.i("info", _id+"-"+name+"-"+age);
}


********Android的api方法对数据库进行操作


//values 存值,key-value形式
ContentValues values = new ContentValues();
values.put("name", "name"+i);
values.put("age", 2+i);
values.put("sex", "f");


//插入数据
* table:要插入的表名
* nullColumnHack:没有插入字段时的默认值,一般放置的都是null,String类型
 * values:要插入的数据内容,是以键值对的形式存在,key:表的字段    value:要插入字段的内容


 * 返回值:插入行的行号id,如果插入失败,则返回-1
long rowId = db.insert(tableName, null, values);


//删除数据
* table:表明
* whereClause:where语句后跟的筛选条件(不写where关键字)
* whereArgs:筛选条件的具体值 如果为null,则选择全部

* 返回值:删除的条数
//delete from student where _id=30
int nums = db.delete(tableName, "_id=?", new String[]{30+""});


//更新,替换数据
* table:表名
* values:要修改的内容 key-value
* whereClause:where语句后跟的筛选条件(不写where关键字)
 * whereArgs:筛选条件的具体值

* 返回值:收到修改影响的行数
//update student set sex = "m" where name = name5 or name=name6
int nums = db.update(tableName, values, "name=? or name=?", new String[]{"name5","name6"});


//查询数据
* table:表名
* columns:要查询的字段,字符串数组,如果查询所有字段就写null
* selection:where语句后跟的筛选条件(不写where关键字)
* selectionArgs:筛选条件的具体值
* groupBy,having,orderBy:分组,排序


//select name,age from student where _id=100
Cursor cursor = db.query(tableName, new String[]{"name","age","sex"} , 
"sex = ?", new String[]{"f"} , null, null, null);
//select * from student
Cursor cursor2 = db.query(tableName, null, null, null, null, null, null);
(1)Cursor.getCount()获得Cursor对象中记录条数,可以理解为有几行。
(2)Cursor.getColumnCount(),获得Cursor对象中记录的属性个数,可以理解为有几列。
(3)Cursor.moveToFirst(),将Cursor对象的指针指向第一条记录。
(4)Cursor.moveToNext(),将Cursor对象的指针指向下一条。
(5)Cursor.isAfterLast(),判断Cursor对象的指针是否指向最后一条记录。
(6)Cursor.close(),关闭Cursor对象。
(7)Cursor.deactivate(),取消激活状态。
(8)Cursor.requery(),重新查询刷新数据。


*******AQLite的适配器SimpleCursorAdapter实体类
adapter = new SimpleCursorAdapter(
this, //上下文对象
R.layout.item, //每个item要展示的布局文件id
null, //带有数据的cursor游标
new String[]{"name","age","sex"}, //查询表的字段数组
new int[]{R.id.name,R.id.age,R.id.sex}, //布局的id
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);//flag标记


//对于数据库游标来说是没有意义的
//adapter.notifyDataSetChanged();


//用当前的游标去替换之前的旧数据游标
adapter.swapCursor(cursor);


*****分页查询
分页SQL:select * from table limit offset,length    offset查询开始的行下标,length查询的条数


Cursor cursor = db.query("student", null, null, null, null, null, null, "0,5");最后一个参数:limit





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值