1.1 SQLiteOpenHelper —-> 帮助类
* onCreate() —-> 创建方法
* onUpgrade() —-> 数据库升级方法
* onOpen() —-> 打开数据库方法
1.2
给sdcard加权限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
给数据库问价配置 读写权限
两个exit是应为 多了一次进入root权限
H:\workplace\AndroidStudio\AndroidStudioProjects\SqliteDemo>adb shell
generic_x86:/ $ su
generic_x86:/ # chmod 777 /data/data/com.imooc.sqlitedemo/databases/info.db
generic_x86:/ # exit
generic_x86:/ $ exit
到数据库文件下把数据库文件考到 sdcard上
H:\workplace\AndroidStudio\AndroidStudioProjects\SqliteDemo>adb shell
generic_x86:/ $ su
generic_x86:/ # cd data
generic_x86:/data # cd data
generic_x86:/data/data # cd com.imooc.sqlitedemo/databases/
generic_x86:/data/data/com.imooc.sqlitedemo/databases # cat info.db > /sdcard/info.db
generic_x86:/data/data/com.imooc.sqlitedemo/databases # exit
generic_x86:/ $ exit
把数据库文件info.db 导入到 默认问价夹下
即(H:\workplace\AndroidStudio\AndroidStudioProjects\SqliteDemo)
H:\workplace\AndroidStudio\AndroidStudioProjects\SqliteDemo>adb pull /sdcard/info.db
/sdcard/info.db: 1 file pulled. 2.6 MB/s (16384 bytes in 0.006s)
MainActivity.xml 文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.imooc.sqlitedemo.MainActivity"
android:orientation="vertical"
>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="创建数据库"
android:onClick="createDb"
android:background="#ffbbff"/>
<Button
android:id="@+id/btn_insert"
android:layout_height="wrap_content"
android:text="插入数据"
android:onClick="click"
android:background="#ffbbff"
android:layout_marginTop="15dp"
android:layout_width="wrap_content" />
<Button
android:id="@+id/btn_update"
android:layout_height="wrap_content"
android:text="修改数据"
android:onClick="click"
android:background="#ffbbff"
android:layout_marginTop="15dp"
android:layout_width="wrap_content" />
<Button
android:id="@+id/btn_delet"
android:layout_height="wrap_content"
android:text="删除数据"
android:onClick="click"
android:background="#ffbbff"
android:layout_marginTop="15dp"
android:layout_width="wrap_content" />
<Button
android:id="@+id/btn_insertAPI"
android:layout_height="wrap_content"
android:text="插入数据API"
android:onClick="onClick"
android:background="#ffbbff"
android:layout_marginTop="15dp"
android:layout_width="wrap_content" />
<Button
android:id="@+id/btn_updateAPI"
android:layout_height="wrap_content"
android:text="修改数据PI"
android:onClick="onClick"
android:background="#ffbbff"
android:layout_marginTop="15dp"
android:layout_width="wrap_content" />
<Button
android:id="@+id/btn_deletAPI"
android:layout_height="wrap_content"
android:text="删除数据API"
android:onClick="onClick"
android:background="#ffbbff"
android:layout_marginTop="15dp"
android:layout_width="wrap_content" />
LinearLayout>
MainActivity.java
package com.imooc.sqlitedemo;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.imooc.utils.Constant;
import com.imooc.utils.DbManger;
import com.imooc.utils.MySqliteHelper;
import com.imooc.sqlitedemo.R;
public class MainActivity extends AppCompatActivity {
private MySqliteHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
helper = DbManger.getIntance(this);//获得数据库帮助类的对象
}
/*
* 点击按钮创建数据库
* */
public void createDb(View view){
/*
*来自MySqliteHelper的父类(即SQLiteOpenHelper)
* getReadableDatabase() getWritableDatabase() 创建或打开数据库。
*如果数据库不存在则创建数据库 如果数据库存在直接打开数据库
* 默认情况下这两个函数都表示打开或者创建可读可写的数据库对象
*
* 如果磁盘已满或者是数据库本身权限等情况下 getReadableDatabase() 打开的是只读数据库
* */
SQLiteDatabase db = helper.getWritableDatabase();
}
public void click(View view){
switch (view.getId()){
case R.id.btn_insert:
SQLiteDatabase db = helper.getWritableDatabase(); //声明一次就行。
String sql = "insert into "+ Constant.TABLE_NAME+" values(1,'zhangsan',20)";
DbManger.execSQL(db,sql);
String sql1 = "insert into "+ Constant.TABLE_NAME+" values(2,'lisi',20)";
DbManger.execSQL(db,sql1);
db.close();
break;
case R.id.btn_update:
db = helper.getWritableDatabase();
String sql2 = "update "+ Constant.TABLE_NAME+" set "+Constant.NANE
+"='xioaming' where "+Constant._ID+"=1";
DbManger.execSQL(db,sql2);
db.close();
break;
case R.id.btn_delet:
db = helper.getWritableDatabase();
String sql3 = "delete from "+Constant.TABLE_NAME+" where "+Constant._ID+" = 2";
DbManger.execSQL(db,sql3);
db.close();
break;
}
}
public void onClick(View view){
switch (view.getId()){
case R.id.btn_insertAPI:
SQLiteDatabase db = helper.getWritableDatabase();
/*
*查看API代码的快捷键 ctrl+Q
*insert(String table, String nullColumnHack, ContentValues values)
*String table 表示插入数据表的名称
* String nullColumnHack 参数:null 表示插入空行
* ContentValues values 键为String类型的hashmap集合
* 返回值 log 表示插入数据的列数
*/
ContentValues values = new ContentValues();
values.put(Constant._ID,110);
values.put(Constant.NANE,"xaiosan");
values.put(Constant.AGE,16);
long result = db.insert(Constant.TABLE_NAME, null, values);
if(result != 0){
Toast.makeText(this,"插入成功",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"插入失败",Toast.LENGTH_SHORT).show();
}
db.close();
break;
case R.id.btn_updateAPI:
db = helper.getWritableDatabase();
/*
*
* update(String table, ContentValues values, String whereClause, String[] whereArgs);
* String table 表示修改的数据表的名称
* ContentValues values 表示键为String类型的hasmap
* String whereClause 表示修改条件
* String[] whereArgs 表示修改条件的占位符
* 返回值 int 表示修改的条数
* */
ContentValues cv = new ContentValues();
cv.put(Constant.NANE,"小慕");//put(需要修改的字段名称,修改后的字段值)
//int count = db.update(Constant.TABLE_NAME,cv,"Constant._ID+"=?",null);
int count = db.update(Constant.TABLE_NAME,cv,Constant._ID+"=?",new String[]{"110"});
// ? 占位
if(count > 0){
Toast.makeText(MainActivity.this,"修改成功",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this,"修改失败",Toast.LENGTH_SHORT).show();
}
db.close();
break;
case R.id.btn_deletAPI :
db = helper.getWritableDatabase();
/*
* int delete(String table, String whereClause, String[] whereArgs)
* String table 表示删除数据表的名称
* String whereClause 表示删除的条件
* String[] whereArgs 表示删除条件的占位符
* */
int count2 = db.delete(Constant.TABLE_NAME,Constant._ID+"=?",new String[]{"1"});
if(count2 > 0){
Toast.makeText(MainActivity.this,"删除成功",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this,"删除失败",Toast.LENGTH_SHORT).show();
}
db.close();
break;
}
}
}
Constant.java
package com.imooc.utils;
/**
* Created by JC on 2017/8/30.
* 数据库常量
*/
public class Constant {
public static final String DATABASE_NAME="info.db";//数据库名称
public static final int DATABASE_VERSION=1;//数据库的版本号
public static final String TABLE_NAME="person";//表名
public static final String NANE = "name";
public static final String _ID = "_id";
public static final String AGE = "age";
}
DbManger.java
package com.imooc.utils;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
/**
* Created by JC on 2017/8/30.
* 数据库:数据持久化得存储,
* Activity:数据页面的展示,
* 专门业务逻辑处理的类,
*
* 主要是对数据库操作的工具类。
*/
public class DbManger {
private static MySqliteHelper helper;
public static MySqliteHelper getIntance(Context context){ //获得 helper对象
if(helper == null){
helper = new MySqliteHelper(context);
}
return helper;//else
}
/*
根据sql语句在数据库中执行语句
* @param db 数据库对象
* @param sql sql语句
*/
public static void execSQL(SQLiteDatabase db,String sql){
if( db != null){
if(sql != null && !"".equals(sql)){ //sql不为空
db.execSQL(sql);
}
}
}
}
MySqliteHelper.java
package com.imooc.utils;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* Created by JC on 2017/8/30.
*
* SQLiteOpenHelper
* 作用:
* 1.提供onCreate() onUpgrade()等创建数据库更新数据的方法
* 2.提供了获取数据库对象的函数
*/
public class MySqliteHelper extends SQLiteOpenHelper{
/**
*构造函数
* @param context 上下文对象
* @param name 表示创建数据库的名称
* @param factory 游标工厂
* @param version 表示当前创建数据库的版本 要求:version >= 1
*/
public MySqliteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public MySqliteHelper(Context context){
super(context,Constant.DATABASE_NAME,null,Constant.DATABASE_VERSION);
}
//重写方法
// 注解,@param是参数的解释
/**
*当数据库创建时回调的函数
*@param db 数据库对象
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("tag","------ onCreate------");
String sql = "create table "+Constant.TABLE_NAME+"("+Constant._ID+
" Integer primary key,"+Constant.NANE+" varchar(10),"+Constant.AGE+" Integer)";
db.execSQL(sql);//执行sql语句
}
/**
*当数据库版本更新时回调的函数
* @param db 数据库对象
* @param i 数据库旧版本
* @param i1 数据库新版本
*/
@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
Log.i("tag","------ onUpgrade------");
}
/**
* 当数据库打开时回调的函数
* @param db 数据库对象
*/
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
Log.i("tag","------ onOpen------");
}
}