数据库存储:SQLite
创建数据库:
自定义
MySQLiteOpenHelper类继承
SQLiteOpenHelper。重写构造函数和oncreate方法。
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
/**
* Created by Administrator on 2015/9/7.
*/
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name,factory, version);
}
public MySQLiteOpenHelper(Context context, String name){
this(context, name,null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exists user("
+ "id integer primary key,"
+ "name varchar(20),"
+ "password integer(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
在主函数中,必须调用
Create and/or open a database that will be used for reading and writing.
|
/**创建数据库*/添加数据
MySQLiteOpenHelper mySQLiteOpenHelper = new MySQLiteOpenHelper(getApplicationContext(),"MY_FIRST_DB.db");
/**调用getWritableDatabase完成创建*/
SQLiteDatabase database = mySQLiteOpenHelper.getWritableDatabase();
long
|
Convenience
method for inserting a row into the database.
|
table 要插入数据的表的名称
values:一个ContentValues对象,类似一个map.通过键值对的形式存储值。
nullColumnHack:
当values参数为空或者里面没有内容的时候,我们insert是会失败的(底层数据库不允许插入一个空行),为了防止这种情况,我们要在这里指定一个
列名,到时候如果发现将要插入的行为空行时,就会将你指定的这个列名的值设为null,然后再向数据库中插入。
case R.id.button_insert:
ContentValues values = new ContentValues();
values.put("name","张三");
values.put("password","123456");
database.insert("user",null,values);
break;另一种方法(通过Sql语句):String sql = "insert into user(username,password) values (
'Jack Johnson'
,
'iLovePopMuisc'
);
//插入操作的SQL语句
db.execSQL(sql);
//执行SQL语句
删除数据
int
|
Convenience
method for deleting rows in the database.
|
table:表名
whereClause:删除的条件
whereArgs:条件的参数
同样有2种方式可以实现
123String whereClause =
"username=?"
;
//删除的条件
String[] whereArgs = {
"Jack Johnson"
};
//删除的条件参数
db.delete(
"user"
,whereClause,whereArgs);
//执行删除
使用execSQL方式的实现
12String sql =
"delete from user where username='Jack Johnson'"
;
//删除操作的SQL语句
db.execSQL(sql);
//执行删除操作
删除所有数据:
database.delete("user","1",null);
修改数据
int
|
Convenience
method for updating rows in the database.
|
ContentValues values1 = new ContentValues();
values1.put("name","王五");
values1.put("password",125544);
database.update("user",values1,"name = '张三'",null);String[] whereArgs = {
"张三"
};
database.update("user",values1,"name = '?'",whereArgs
);同上,仍是2种方式
12345ContentValues cv =
new
ContentValues();
//实例化ContentValues
cv.put(
"password"
,
"iHatePopMusic"
);
//添加要更改的字段及内容
String whereClause =
"username=?"
;
//修改条件
String[] whereArgs = {
"Jack Johnson"
};
//修改条件的参数
db.update(
"user"
,cv,whereClause,whereArgs);
//执行修改
使用execSQL方式的实现
12String sql =
"update [user] set password = 'iHatePopMusic' where username='Jack Johnson'"
;
//修改的SQL语句
db.execSQL(sql);
//执行修改
查询数据:
使用SQL语句获得游标
Cursor c = database.rawQuery("select * from user",null);
query(
String table,
String[] columns,
String selection,
String[] selectionArgs,
String groupBy,
String having,
String orderBy,
String limit)
Query
the given table, returning a
Cursor over
the result set.
| |
query(boolean
distinct,
String table,
String[] columns,
String selection,
String[] selectionArgs,
String groupBy,
String having,
String orderBy,
String limit,
CancellationSignal cancellationSignal)
Query
the given URL, returning a
Cursor over
the result set.
| |
query(
String table,
String[] columns,
String selection,
String[] selectionArgs,
String groupBy,
String having,
String orderBy)
Query
the given table, returning a
Cursor over
the result set.
| |
query(boolean
distinct,
String table,
String[] columns,
String selection,
String[] selectionArgs,
String groupBy,
String having,
String orderBy,
String limit)
Query
the given URL, returning a
Cursor over
the result set.
|
数据查询相对前面几种方法就复杂一些了,因为查询会带有很多条件
通过query实现查询的
public Cursor query(String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
各参数说明:
- table:表名称
- colums:列名称数组
- selection:条件子句,相当于where
- selectionArgs:条件语句的参数数组
- groupBy:分组 GROUP BY NAME 如:name
- having:分组条件 HAVING count(name)<2; 如:count(name)<2
- orderBy:排序类 正序:ISA 倒序:IDSC 如:id ASC
- limit:分页查询的限制 2 offset 2 如 2,3 (offset用,代替) 偏移量在钱,数量在后
- Cursor:返回值,相当于结果集ResultSet 可以通过上网查询:http://www.w3school.com.cn/sql/sql_having.asp
针对游标(Cursor)也提供了不少方法
方法名称 | 方法描述 |
---|---|
getCount() | 总记录条数 |
isFirst() | 判断是否第一条记录 |
isLast() | 判断是否最后一条记录 |
moveToFirst() | 移动到第一条记录 |
moveToLast() | 移动到最后一条记录 |
move(int offset) | 移动到指定的记录 |
moveToNext() | 移动到吓一条记录 |
moveToPrevious() | 移动到上一条记录 |
getColumnIndex(String columnName) | 获得指定列索引的int类型值 |
遍历的方法:
stringBuffer = new StringBuffer();
Cursor c = database.query("user", null, null, null, null, null, null);//查询并获得游标
if(c.moveToFirst()){//判断游标是否为空
while(c.moveToNext()){
String username = c.getString(c.getColumnIndex("name"));
int password = c.getInt(c.getColumnIndex("password"));
stringBuffer.append(username + password);
Log.d("select", stringBuffer.toString());
}
}
mTextView.setText(stringBuffer.toString());
实现代码
1
2
3
4
5
6
7
8
|
Cursor c = db.query(
"user"
,
null
,
null
,
null
,
null
,
null
,
null
);
//查询并获得游标
if
(c.moveToFirst()){
//判断游标是否为空
for
(
int
i=
0
;i<c.getCount();i++){
c.move(i);
//移动到指定记录
String username = c.getString(c.getColumnIndex(
"username"
);
String password = c.getString(c.getColumnIndex(
"password"
));
}
}
|
通过rawQuery实现的带参数查询
1
2
3
4
|
Cursor c = db.rawQuery(
"select * from user where username=?"
,
new
Stirng[]{
"Jack Johnson"
});
if
(cursor.moveToFirst()) {
String password = c.getString(c.getColumnIndex(
"password"
));
}
|