工作内容:
1.Android 自带数据库SQLite的使用
2.SQLite进阶版(下图打开data/data/包名/database查看你创建的数据库文件)
3.数据库语句:【打开本地数据库文件 SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(file, null);】
1.创建表
create table student(id integer primary key autoincrement,name varchar(20),sax varchar(255))//创建表student,字段id是integer型主键自增,字段name长度是20字节,字段sax是varchar长度是255
2.添加列
alter table student add column grade varchar//在student表格中添加grade列,类型为varchar
3.删除表
drop table student//删除表
4.修改表名
ALTER TABLE 旧表名 RENAME TO 新表名
5.删除表中的列name(先查询出来所有数据(除去name列),创建出新表,放入)
类似:create table teacher as select id,name from student//查询student中的id,name放入新创建的表teacher中
执行:db.execSql(sql语句)
学习分享:
Android数据库SQLite属于轻量级数据库
使用前熟悉"SQL语句",使用起来更简单
SQLite使用步骤:
第一步:写一个类MySQLiteOpenHelper继承SQLiteOpenHelper
public class MySQLHelper extends SQLiteOpenHelper {
Context context;
//参数说明:上下文,数据库名称,版本号
public MySQLHelper(Context context,String dataBaseName,int version){
super(context,dataBaseName,null,version);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
//在数据库db中创建表:t_user,3列:integer型的 _id,字符串型的username,字符串型的pass
String createTable = "CREATE TABLE t_user(_id integer primary key autoincrement," +
"username varchar(255)," +
"pass varchar(255))";
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
}
第二步:写一个界面去做对SQLite的操作
成员变量:
private MySQLHelper mySQLHelper;
private SQLiteDatabase sqLiteDatabase;
onCreate方法中:初始化MySQLHelper对象(建立一个数据库链接/如果没有该数据库,则创建一个数据库)
mySQLHelper = new MySQLHelper(context,"yellowpage.db",version);
成员方法:
/**
* 插入数据库
* “增删改”方法中均使用了查询方法
* 为了让list中的文件得到更新
*/
public void insertData(){
//将执行MySQLiteOpenHelper的onCreate方法
sqLiteDatabase = mySQLHelper.getWritableDatabase();
String insertSql = "insert into table1("+
"name,number)"+
"values('狗儿','111')";
sqLiteDatabase.execSQL(insertSql);
serchData();
sqLiteDatabase.close();
}
//删除方法
public void deleteData(String sql){
int x = Integer.parseInt(sql);
sqLiteDatabase = mySQLHelper.getWritableDatabase();
String deleteSql = "delete from table1 where id = ?";
sqLiteDatabase.execSQL(deleteSql,new String[]{sql});
serchData();
sqLiteDatabase.close();
}
//修改
public void updateDate(String sql){
sqLiteDatabase = mySQLHelper.getWritableDatabase();
String updateSql = "update table1 set name = ? where _id = 2";
sqLiteDatabase.execSQL(updateSql,new String[]{sql});
serchData();
sqLiteDatabase.close();
}
//查询数据库
public void serchData(){
sqLiteDatabase = mySQLHelper.getWritableDatabase();
list.clear();
String selectSQL = "select * from table1";
Cursor cursor = sqLiteDatabase.rawQuery(selectSQL,null);
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String number = cursor.getString(cursor.getColumnIndex("number"));
list.add(name);
list.add(number);
}
adapter.notifyDataSetChanged();
sqLiteDatabase.close();
}
下面是2中不同的从数据库取数据的方法
/**
* 使用前提:使用mySQLHelper创建了数据库/链接到
* 查询数据库方法【1】(用于YellowPage_sonPage)
* 返回一个list
* @param tableName
* @return
*/
public List<PhoneCall> select(String tableName){
List<PhoneCall> listYellowPage_sonPage = new ArrayList<PhoneCall>();
SQLiteDatabase sqLiteDatabase = mySQLHelper.getReadableDatabase();
Cursor cursor = sqLiteDatabase.rawQuery("select * from " + tableName,null);
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String phoneNumber = cursor.getString(cursor.getColumnIndex("number"));
listYellowPage_sonPage.add(new PhoneCall(name,phoneNumber));
}
sqLiteDatabase.close();
return listYellowPage_sonPage;
}
/**
* 使用前提:存在本地数据库文件
* 查询数据库方法【2】(用于YellowPage_sonPage)
* 返回一个list
* @param tableName 要查询表名
* @param file 本地数据库文件对应的File对象
* @return
*/
public List<PhoneCall> select(String tableName,File file){
List<PhoneCall> listYellowPage_sonPage = new ArrayList<PhoneCall>();
/**
* 与方法1中不同的地方
* 无需去链接数据库,直接打开本地的数据库文件,并读取其中的表
*/
SQLiteDatabase sqLiteDatabase = SQLiteDatabase.openOrCreateDatabase(file,null);
Cursor cursor = sqLiteDatabase.rawQuery("select * from " + tableName,null);
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String phoneNumber = cursor.getString(cursor.getColumnIndex("number"));
listYellowPage_sonPage.add(new PhoneCall(name,phoneNumber));
}
sqLiteDatabase.close();
return listYellowPage_sonPage;
}
注意:容易出错位置:
1.增删改查过程中把数据库名当做表名。
2.操作数据库过程中列名不要写错,不然查询不出内容且会报错。
3.String updateSql = "update t_user set username = ? where _id = 2";sqLiteDatabase.execSQL(updateSql,new String[]{sql});这两句中new String里的sql对应着updateSql 里的“?”,问号有几个就需要几个sql
实例:
Cursor cursor = db.rawQuery("select * from person where name like ? and age=?", new String[]{"%传智%", "4"});
查询条件:“%传智%” 对应第一个问号,"4" 对应第二个问号
二 、SQLite进阶版【利用SQLite的delete,update,insert,delete+ContentValues实现数据库的增删改查操作】
SQLiteOpenHelper代码:版本升级添加列/删除表
/**
* Created by Administrator on 2016/9/2.
*/
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
public MySQLiteOpenHelper(Context context, String dataBaseName, int version) {
super(context, dataBaseName, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建表(2列 id列和title列)
String sql = "create table mornews(id integer primary key autoincrement," +
"title varchar(255))";
db.execSQL(sql);
//创建数据库表(存放收藏网页)简约版
db.execSQL("create table web_tb(title text,url text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(oldVersion<newVersion){
// db.execSQL("alter table student add column grade varchar");//添加一列
db.execSQL("drop table student");//删除表
}
}
}
可以在onUpgrade中写入版本号跟新后的操作
1.创建新的表(当创建了表之后)【可以通过版本好来判断是否创建】【可以判断版本,如果不存在老版本则直接创建所有的表,如果存在老版本则添加新的表】
2.删除或修改过去的表
自定义SQLiteUtil
public class SQLiteUtil {
private static MySQLiteOpenHelper mySQLiteOpenHelper = null;
private static SQLiteDatabase sqLiteDatabase = null;
private static void getInstance(Context context){
mySQLiteOpenHelper = new MySQLiteOpenHelper(context,"MorNews.db",1);
}
/**
* 对外接口 收藏网页信息时调用【添加到数据库】
* @param context
* @param title 网页的标题
* @param url 网页的网址
*/
public static void insertWebInfo(Context context,String title,String url){
getInstance(context);
sqLiteDatabase = mySQLiteOpenHelper.getWritableDatabase();
//方法1:使用SQL语句插入数据库
// String insertSql = "INSERT INTO web_tb ('title','url') VALUES('"+title+"','"+url+"')";
// sqLiteDatabase.execSQL(insertSql);
//方法2:使用sqLiteDatabase的insert方法
ContentValues contentValues = new ContentValues();
contentValues.put("title",title);
contentValues.put("url",url);
sqLiteDatabase.insert("web_tb",null,contentValues);
sqLiteDatabase.close();
}
/**
* 对外接口 从数据库删除数据【按条件】
* @param context
* @param url 删除条件
*/
public static void deleteWebInfo(Context context,String url){
getInstance(context);
sqLiteDatabase = mySQLiteOpenHelper.getWritableDatabase();
//方法1:sqLiteDatabase的delete方法实现
// sqLiteDatabase.delete("web_tb","url=?",new String[]{url});
//方法2:使用SQL语句删除数据库中的指定内容
String deleteString = "DELETE FROM web_tb WHERE url=?";
sqLiteDatabase.execSQL(deleteString,new String[]{url});
sqLiteDatabase.close();
}
/**
* 对外接口,网页收藏界面调用,返回已收藏的页面数据【需关闭sqliteDatabase】
* 查询数据库表中所有内容
*/
public static List<WebInfo> getWebInfoFromSQLite(Context context){
List<WebInfo> list = new ArrayList<>();
getInstance(context);
sqLiteDatabase = mySQLiteOpenHelper.getWritableDatabase();
Cursor cursor = sqLiteDatabase.rawQuery("select * from web_tb",null);
while (cursor.moveToNext()){
String title = cursor.getString(cursor.getColumnIndex("title"));
String url = cursor.getString(cursor.getColumnIndex("url"));
list.add(new WebInfo(title,url));
}
return list;
}
/**
* 对外接口,查询对象[数据]是否存在于数据库
*/
public static boolean checkUrlIsSaved(Context context,String url){
if(url!=null&&url!=""){
List<WebInfo> list = getWebInfoFromSQLite(context);
for (int i = 0; i < list.size(); i++) {
if(url.equals(list.get(i).getUrl())){
return true;
}
}
}
return false;
}
/**
* 获取搜索信息的匹配数据【需关闭sqliteDatabase】
* 实现模糊搜索
*/
public static List<WebInfo> getSearchInfo(Context context,String string){
List<WebInfo> list = new ArrayList<>();
getInstance(context);
sqLiteDatabase = mySQLiteOpenHelper.getWritableDatabase();
Cursor cursor = sqLiteDatabase.rawQuery("select * from web_tb where title like ?",new String[]{'%'+string+'%'});
while (cursor.moveToNext()){
String title = cursor.getString(cursor.getColumnIndex("title"));
String url = cursor.getString(cursor.getColumnIndex("url"));
list.add(new WebInfo(title,url));
}
return list;
}
/**
* 删除表中所有数据【需关闭sqliteDatabase】
*/
public static void deleteAll(Context context){
getInstance(context);
sqLiteDatabase = mySQLiteOpenHelper.getWritableDatabase();
// sqLiteDatabase.delete("web_tb",null,null);
String deleteSql = "DELETE FROME web_tb";
sqLiteDatabase.execSQL(deleteSql);
}
/**
* 修改表中的数据【需关闭sqliteDatabase】
* @param context
* @param columnName 删除条件——列名=?
* @param args 删除条件——列名对应的值
* @param newValue 跟新的新值
*/
public static void updateData(Context context,String columnName,String args,String newValue){
getInstance(context);
sqLiteDatabase = mySQLiteOpenHelper.getWritableDatabase();
// ContentValues values = new ContentValues();
// values.put("title",newValue);
// //参数1:表名,参数2:ContentValues,参数3:条件列名,参数4:条件列植
// sqLiteDatabase.update("web_tb",values,columnName+"=?",new String[]{args});
String updateSql = "UPDATE web_tb SET title='"+newValue+"'," +
"url='"+"http://www.baidu.com"+"' WHERE '"+columnName+"'='"+args+"'";
sqLiteDatabase.execSQL(updateSql);
//同时操作2张表
// UPDATE table_references SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]
// UPDATE table1, table2 SET table1.value=table2.value, a.type=b.type WHERE table1.sid=table2.sid;
// UPDATE table1 SET col1 = 1 WHERE table1.col2 = (SELECT col2 FROM table2 WHERE table2.col2 = table1.col2 AND table2.col3 = 5);
}
}