Day 04
SQLite:把結構化的數據保存在私有數據庫中。
數據庫的增刪改查
創建數據庫
在model包:DBHelper.java文件中,
public class DBHelper extends SQLiteOpenHelper{
}
修改構造方法DBHelper
public DBHelper(Contextcontext) {
super(context, DBNAME, null, 1);
}
在oncreate方法中創建數據庫
onCreate(SQLiteDatabase db)————創建表格語句
String sqlStr="create table "+TABNAME+"(" +
"id integer primary key autoincrement," +
"name varchar(20),"+
"cuisine varchar(20),"+
"picPath varchar(80),"+
"material varchar(20),"+
"ingredient varchar(20),"+
"cookingStep varchar(20),"+
"audioPath varchar(80),"+
"videoPath varchar(80))";
db.execSQL(sqlStr);
SQLite數據庫的生成目錄:data——data——應用程序包—databases目錄-XXX.db文件
插入數據
1. 創建進行數據處理的XXXDao.java文件。
2. 添加成員變量:
private FoodHelper helper;
private Context context;
3. 重寫構造函數(source——>generate constructor using field)
勾選context,不用勾選helper
4. 添加代碼:
public FoodDao(Context context) {
super();
this.context = context;
helper=new FoodHelper(context);
}
5. 創建私有成員變量
private SQLiteDatabase db;
6. 編寫打開數據庫的方法openDB()
//打開數據庫,並獲得數據庫對象
public void openDB(){
db=helper.getWritableDatabase();
}
7. 編寫關閉數據庫的方法closeDB()
//關閉數據庫
public void closeDB(){
if(db!=null){
db.close();
}
}
8. 數據庫插入數據方法add():
public void add(){
//openDb
openDB();
//創建一個contentvalues:————>是一個map集合
ContentValuesvalue=newContentValues();
//主鍵自增,不需要賦任何值。
//主鍵autoincrement:用putnull即可
value.putNull("id");
value.put("name", "水煮肉片");
//插入數據的方法
db.insert("food2", null, value);
//closeDB
closeDB();
}
注意:插入數據的api:contentValues:內容值:一個集合。用put方法插入。
Public void insertDB(Music music){
ContentValues values = new ContentValues();
values.put(FIELD_ID, music.getId());
values.put(FIELD_NAME,music.getName());
values.put(FIELD_PLAYER, music.getPlayer());
values.put(FIELD_PATH, music.getFilepath());
database.insert(TABLE_NAME, null, values);
}
查詢方法query
複雜。
Query方法
public Cursor query (String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having, String orderBy)
table:要查詢的數據庫表名
columns:指定查詢所要返回的列
selection:指定查詢的條件,對應於SQL WHERE子句
selectionArgs:與selection配套,指定查詢條件中參數的值
groupBy:對應於SQLGROUPBY子句——分組查詢
having:對應於SQL HAVING子句——聚合語句查詢
orderBy:對應於SQLORDERBY子句——排序
limit:對應於SQLLIMIT子句
distinct:對應於SQLDISTINCT子句
返回值:代表結果集的Cursor對象
查詢全部數據:只需要給query方法傳table一個參數即可。
步驟:
1. 在XXXDao.java中添加select方法
public void selectedAll(){
}
2. 添加打開和關閉數據庫的方法
openDB();
closeDB();
3. 查詢語句:
Cursor c=db.query("food2", null, null, null, null, null, null);
4. 添加代碼:
if(c!=null){
while (c.moveToNext()) {
}
}
5. 在while循環中添加
while (c.moveToNext()) {
intid=c.getInt(c.getColumnIndex("id"));
String name=c.getString(c.getColumnIndex("name"));
System.out.println(id+"---"+name);
}
6. 在XXXactivity.java文件中添加
dao.selectedAll();
找不到adb時,在ddms模式下,找到adb頁面,resetadb
根據條件查詢
//根據條件查詢——>name
1. 創建方法:selectedByName
2. 添加開關數據庫的代碼:
openDB();
closeDB();
3. 編寫sql語句
注意添加單引號!!!!!!
String sql="name like'%"+name+"%'";
4. 創建cursor
Cursor c=db.query("food2", null, sql, null, null, null, null);
5. 添加循環
if(c!=null){
while (c.moveToNext()) {
int id=c.getInt(c.getColumnIndex("id"));
Stringname1=c.getString(c.getColumnIndex("name"));
System.out.println(id+"---"+name1);
}
}
6. 在XXXactivity.java文件中添加
dao.selectedByName("水");
編輯框監聽
1. 在activityXXX.xml中添加editText組件
2. 在XXXActivity.java文件中添加成員變量
private EditText mEdtx;
private String name;
3. 在XXXActivity.java文件中找到這個editText
mEdtx=(EditText)findViewById(R.id.edtx);
4. 添加方法mEdtx.addTextChangedListener(){}
5. 在括號中填入:new TextWatcher(),會自動生成三個函數
6. 在public void onTextChanged(CharSequence s, int start, int before, int count) 添加代碼:
Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
int length=s.length();————輸入字符串的長度
if(length<1){——爲空則不操作
return;
}
name=s.toString();
dao.selectedByName(name);
列表——listview組件(縱向列表組件)
Listview在Layout的composite中
只顯示文本
只顯示圖片加文本
ListView的創建和使用步驟
1. 在activityXXX.xml中拖入一個listview組件
2. 在XXXActivity.java文件中準備數據源
private String [] arr={"川菜","魯菜","粵菜","湘菜","花菜"};
3. 聲明listview
private ListView mLv;
4. 初始化listview
mLv=(ListView)findViewById(R.id.listView1);
5. 聲明適配器
ArrayAdapter<String> adapter =newArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arr);
6. 給適配器綁定數據源
mLv.setAdapter(adapter);
顯示圖片加文本的ListView--->縱向列表
給listview匹配適配器步驟:
1. 在layout文件夾下創建list_item.xml文件
2. 在list_item.xml文件編輯下拉菜單每一行的顯示佈局
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"/>
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"/>
3. 在要顯示下拉菜單的XXXActivity.java文件中聲明一個listview
private ListView mLv;
4. 在XXXActivity.java文件OnCreate方法中初始化listview
mLv=(ListView)findViewById(R.id.listView1);
5. 創建一個simpleAdapter:
SimpleAdapter adapter2=new SimpleAdapter(context,data,resource,from,to);
參數解釋:
Context:綁定的activity.this
Data:數據源map:存放的數據
Resource:佈局文件————自己做(見第一步)R.layout.list_item
From:map集合所有key——string
To:你自己佈局的所有組件的id——int 數組
6. 創建simpleadapter需要的參數變量XXXActivity的成員變量
private String[] from = {"img","tv"};
private int[] to ={R.id.img,R.id.tv};
//放所有自定義的組件的id
private List<Map<String,Object>> data= new ArrayList<Map<String,Object>>();
7. 數據源初始化
注意:以下代碼要放在第五步創建的SimpleAdapter之前!!!
//數據源初始化,一個map就是一小個選項裏裝配的所有數據
for(int i=0;i<arr.length;i++){
Map<String,Object> map=newTreeMap<String, Object>();
map.put("img", R.drawable.ic_launcher);
map.put("tv", arr[i]);
//private String [] arr={"川菜","魯菜","粵菜","湘菜","花菜"};
data.add(map);
}
8. 給listview配置適配器
mLv.setAdapter(adapter2);
F2————重命名文件
規範化代碼實例:
數據庫操作實例
1. 在要進行數據庫操作的XXXActivity.java文件中添加私有變量
//準備菜系
private String[] cuisine={"川菜","魯菜","粵菜","蘇菜","浙菜","湘菜","閩菜","徽菜","其它"};
//聲明組件
private AutoCompleteTextView mAuTx;
private ImageButton mVideo,mPhoto,mSave,mCuisine_btn;
private EditText mName,mCuisine,mMaterial,mIngredient,mStep;//創建Dao對象
private Dao dao;
2. 在OnCreate方法中實例化dao對象
//一定要記得實例化dao!!!!!!!!!!
dao=newDao(this);
3. 在OnCreate方法中初始化組件
//初始化組件
mAuTx=(AutoCompleteTextView)findViewById(R.id.add_cuisine);
mVideo=(ImageButton)findViewById(R.id.imageButton3);
mPhoto=(ImageButton)findViewById(R.id.imageButton4);
mSave=(ImageButton)findViewById(R.id.add_save_btn);
mCuisine_btn=(ImageButton)findViewById(R.id.add_cuisine_btn);
mName=(EditText)findViewById(R.id.add_name);
mMaterial=(EditText) findViewById(R.id.add_material);
mIngredient=(EditText) findViewById(R.id.add_ingredient);
mStep=(EditText) findViewById(R.id.add_cookingstep);
mCuisine=(EditText) findViewById(R.id.add_cuisine);
4. 在OnCreate方法中創建數組適配器
//創建數組適配器
ArrayAdapter<String> adapter1=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,cuisine);
5. 在OnCreate方法中綁定適配器
//綁定適配器
mAuTx.setAdapter(adapter1);
6. 在OnCreate方法中,給button綁定點擊事件處理
//給菜系添加button綁定點擊事件處理
mCuisine_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
mAuTx.showDropDown();
}
});
7. 給保存button保定單擊處理事件setOnClickListener
//給保存Button綁定點擊處理事件
mSave.setOnClickListener(new OnClickListener() {
@Override
public void onClick(Viewarg0) {
//非空驗證
Stringname=mName.getText().toString();
Stringcuisine=mCuisine.getText().toString();
Stringmaterial=mMaterial.getText().toString();
Stringingredient=mIngredient.getText().toString();
Stringcookingstep=mStep.getText().toString();
Foodf= new Food(name, cuisine, material, ingredient, " ", cookingstep, " ", " ");
dao.add(f);
}
});
8. 從組件獲取組件攜帶的文本
.getText().toString();
例如代碼:
在OnClickListener方法中的onClick方法中:
Stringname=mName.getText().toString();
Stringcuisine=mCuisine.getText().toString();
Stringmaterial=mMaterial.getText().toString();
Stringingredient=mIngredient.getText().toString();
Stringcookingstep=mStep.getText().toString();
9. 創建一個數據模型對象Food.java(model層),並將其數據實體類封裝,
參見下一個大標題“Javabean 實體類的封裝”
10. 創建一個food對象,傳入對應的參數。
在OnClickListener方法中的onClick方法中
Food f= new Food(name, cuisine, material,ingredient, "",cookingstep, "", " ");
11. 調用dao.java數據庫操作類中的add插入一條記錄方法add
//將f這條記錄插入
dao.add(f);
解釋說明:model層
DBHelper.java————>鏈接SQLite數據庫並創建表對象
Dao.java——————>數據庫操作方法增刪改查方法
Food.java————>存放數據模型的數據(結構)類
Javabean 實體類的封裝
1. 在model層創建一個類:food.java
2. 創建私有成員變量
private int id;
private String name;
private String cuisine;
private String material;
private String ingredient;
private String picpath;
private String cookingstep;
private String vediopath;
3. Source->Generate setters and getters->全選->ok
4. Source->Generate Construtor using field->全選(除id)->ok
public food(String name, String cuisine, String material,Stringingredient, String picpath, String cookingstep,
Stringvediopath, String audiopath) {
super();
this.name = name;
this.cuisine = cuisine;
this.material = material;
this.ingredient = ingredient;
this.picpath = picpath;
this.cookingstep = cookingstep;
this.vediopath = vediopath;
this.audiopath = audiopath;
}