Android基础-----数据存储&界面展现
1. Android中创建数据库(**)
- SQLiteOpenHelper
- 自定义一个MySQLiteOpenHelper 继承SQLiteOpenHelper
- 覆写抽象方法
- onCreate(){xxx}
- onUpgrade()
- new MySQLiteOpenHelper(xxxx)
- helper.getWriteableDatabase()
- 创建的数据库文件位置:/data/data/包名/databases/my_user.db
两种数据库获取方式的区别 1. openHelper.getReadableDatabase();和openHelper.getWritableDatabase();的区别 1. 都可读可写,没有任何差异 2. 只有当磁盘满的情况下,前者返回的数据库只读,后者报异常.
2. Android下数据库第一种方式增删改查(**)
纯sql的方式 1. 添加 1. 创建一个MySQLiteOpenHelper对象 openHelper 2. 通过openHelper对象的getWritableDatabase方法获取到SQLiteDatabase对象db 3. db.execSQL(sql,args); 2. 删除 1. 创建一个MySQLiteOpenHelper对象 openHelper 2. 通过openHelper对象的getWritableDatabase方法获取到SQLiteDatabase对象db 3. db.execSQL(sql,args); 3. 修改 1. 创建一个MySQLiteOpenHelper对象 openHelper 2. 通过openHelper对象的getWritableDatabase方法获取到SQLiteDatabase对象db 3. db.execSQL(sql,args); 4. 查询 String sql = "select cname,cage,c_phone from tuser where cage>?"; Cursor cursor = database.rawQuery(sql, new String[]{"30"}); while(cursor.moveToNext()){ String name = cursor.getString(0); int age = cursor.getInt(1); String phone = cursor.getString(2); users.add(new User(name, age, phone)); } cursor.close(); database.close();
3. Android下数据库第二种方式增删改查(***)
- 添加
- long id = db.insert(args);//uid
- 删除
- long deleted = db.delete(args);//删除的数据条数
- 修改
- long updated = db.update(args);//修改成功的条目数
- 查询
- Cursor cursor = db.query(args);
4. 数据库的事务(*)
- 开启事务
- db.beginTransaction();
-
扣除张三500元
-
给李四添加500元
- 将事务提交
- db.setTransactionSuccessful();
-
结束事务
- db.endTransaction();
-
使用事务可以提高批处理效率
5. ListView入门(***)
- MVC M:Model(数据) V:View C:Controller(Servlet/Adapter)
- 在布局中xxx.xml声明ListView
- 初始化ListView
- 给ListView设置一个适配器
- 自定义一个MyAdapter 继承BaseAdapter
- int getCount();
- View getView(int postion,args);
- 数据
- 模拟一些数据
6. ListView优化(****)
1.复用convertView
7. 复杂ListView界面的显示(案例-通信录)(****)
- 需求:
- 访问assets目录中的my_user.db
- 获取assertManager:Context.getAsserts();
- InputStream is = open("my_user.db");
- 拷贝db
- /data/data/包名/databases/my_user.db
- SQLitedatabase db = Context.openOrCreateDatabase("my_user.db");
- 将db中的数据保存在集合中
- Cursor cursor = db.rawQuery(args);
- 遍历Cursor获取
- 将集合中的数据显示在ListView上面
- activity_main.xml 中声明ListView
- MainActivity中初始化lv
- lv.setAdapter(new MyAdapter());
- 自定义MyAdapter继承BaseAdapter
- int getCount()
- View getView(int position,View convertView,ViewGroup parent);
- ListView的每个条目必须是复杂条目
- 自定义一个相对布局list_item.xml
- 将list_item.xml转换为View对象,填充布局文件为View对象,使用打气筒
- 如何将布局大气为View对象?
- 点击每个条目可以打电话
- lv.setOnItemClickListener(OnItemClickListener);
- 自定义一个OnItemClickListener
- 在onItemClick(int postion)方法中拨打电话
- User user = datas.get(positon);
- user.getPhone();
- 打电话
- Intent setAction setData(Uri)
- startActvity(intent);
- 添加权限
- 访问assets目录中的my_user.db
8. 常用获取Inflate的写法(**)
- View view = View.inflate(R.layout.xxx,args);
- View view2 = LayoutInflater.from(MainActivity.this).inflate(R.layout.list_item, null);
- LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUTINFLATERSERVICE); View view3 = inflater.inflate(R.layout.list_item, null);
9. ArrayAdapter的使用(*)
ListView lv = (ListView) findViewById(R.id.lv); /* * 参数1:上下文 * 参数2:系统布局资源idandroid.R.layout.simplelistitem_1 * 参数3:数组或则集合 */ lv.setAdapter(new ArrayAdapter(this, android.R.layout.simplelistitem_1, cities));
10. 异常
- tv_age.setText(user.getAge()); 11-02 08:59:08.072: E/AndroidRuntime(2680): android.content.res.Resources$NotFoundException: String resource ID #0x32 11-02 08:59:08.072: E/AndroidRuntime(2680): at android.content.res.Resources.getText(Resources.java:201) 11-02 08:59:08.072: E/AndroidRuntime(2680): at android.widget.TextView.setText(TextView.java:2863) 11-02 08:59:08.072: E/AndroidRuntime(2680): at com.huida.contacts.MainActivity$MyAdapter.getView(MainActivity.java:101)
- Android Not Response
- 在Activity中如果主(UI)线程被阻塞5秒就可能包ANR异常.