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();
//创建1个contentvalues:――――>是1个map集合
ContentValuesvalue=newContentValues();
//主键自增,不需要赋任何值。
//主键autoincrement:用putnull便可
value.putNull("id");
value.put("name", "水煮肉片");
//插入数据的方法
db.insert("food2", null, value);
//closeDB
closeDB();
}
注意:插入数据的api:contentValues:内容值:1个集合。用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方法传table1个参数便可。
步骤:
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(),会自动生成3个函数
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中拖入1个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文件中声明1个listview
private ListView mLv;
4. 在XXXActivity.java文件OnCreate方法中初始化listview
mLv=(ListView)findViewById(R.id.listView1);
5. 创建1个simpleAdapter:
SimpleAdapter adapter2=new SimpleAdapter(context,data,resource,from,to);
参数解释:
Context:绑定的activity.this
Data:数据源map:寄存的数据
Resource:布局文件――――自己做(见第1步)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. 数据源初始化
注意:以下代码要放在第5步创建的SimpleAdapter之前!!!
//数据源初始化,1个map就是1小个选项里装配的所有数据
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对象
//1定要记得实例化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. 创建1个数据模型对象Food.java(model层),并将其数据实体类封装,
参见下1个大标题“Javabean 实体类的封装”
10. 创建1个food对象,传入对应的参数。
在OnClickListener方法中的onClick方法中
Food f= new Food(name, cuisine, material,ingredient, "",cookingstep, "", " ");
11. 调用dao.java数据库操作类中的add插入1条记录方法add
//将f这条记录插入
dao.add(f);
解释说明:model层
DBHelper.java――――>链接SQLite数据库并创建表对象
Dao.java――――――>数据库操作方法增删改查方法
Food.java――――>寄存数据模型的