写在前面:仅供参考,一般是自己留着看的,如有错误,敬请指正。
这次的更新接着上次的博客,智能移动设备软件开发复习-第二天
第4章 数据存储方式
-
文件存储之内部存储
内部存储是指将应用程序中的数据以文件方式存储到设备的内部,内部存储方式存储的文件被其所创建的应用程序私有,如果其他应用程序要操作本应用程序中的文件,需要设置权限。当创建的应用程序被卸载时,其内部存储文件也被随之删除。FileOutputStream fos = openFileOutput(String name,int mode); FileInputStream fis = openFileInput(String name);
openFileOutput对应将数据存储到指定的文件中,openFileInput则是读取指定文件中的数据。其中的"name"参数表示文件名,"mode"参数表示文件的操作模式,也就是读写文件的方式,分为以下几种:
- MODE_PRIVATE:该文件只能被当前程序读写;
- MODE_APPEND:该文件的内容可以追加;
- MODE_WORLD_READABLE:该文件的内容可以被其他程序读;
- MODE_WORLD_WRITEABLE:该文件的内容可以被其他程序写。
默认情况下,权限为MODE_PRIVATE,其他程序无法访问;如果想要更改权限,得在文件创建的时候指定操作模式为后两种。
- 存储数据:
String fileName = "data.txt";//文件名称 String content = "helloworld";//保存数据 FileOutPutStream fos; try{ fos = openFileOutput(fileName, MODE_PRIVATE); fos.write(content.getBytes());//将数据写入文件中 fos.close(); } catch (Exception e){ e.printStackTrace(); } }
- 取出数据:
取出数据时必须先用read()方法将文件内容读取到buffer缓冲区中,最后将读取到的内容转换成指定字符串。String content = ""; FileInputStream fis; try{ fis = openFileInput("data.txt"); // 获得文件输入流对象 byte[] buffer = new byte[fis.available()];//创建缓冲区,并获取文件长度 fis.read(buffer);//将文件内容读取到buffer缓冲区 content = new String(buffer);//转换成字符串 fis.close();//关闭输入流 } catch (Exception e){ e.printStackTrace(); } }
-
SharedPreferences
- 存储数据
首先需要调用getSharedPreferences(String name,int mode)方法获取实例对象。由于该对象本身只能获取数据,不能对数据进行存储和修改,因此需要调用SharedPreference的edit()方法获取到可编辑的Editor对象,最后通过该对象的putString()方法和putInt()方法来存储数据:
注:操作完数据之后,一定要调用commit()方法进行数据提交,否则所有操作不生效。SharedPreferences sp = getSharedPreferences("data",MODE_PRIVATE);//其中的data为文件名 SharedPreferences.Editor editor = sp.edit(); editor.putString("name", "传智播客"); editor.putInt("age", 8); editor.commit();
- 删除数据
editor.remove("name"); //删除一条数据 editor.clear(); //删除所有数据
- 获取数据
get***()方法的第二个参数为缺省值,如果sp中不存在该key,将返回缺省值,例如getString(“name”,“”),若name不存在,则key就返回空字符串。SharePreferences sp = getSharedPreferences("data",MODE_PRIVATE); String data = sp.getString("name","");
注:获取数据的key值与存入数据的key值的数据类型要一致,否则查找不到数据
- 存储数据
第5章 SQLite数据库
- 数据库的创建
在Android系统中,数据库创建完成后是无法直接对数据进行查看的,要想要查看数据需要使用SQLite Expert Personal可视化工具。【File】 ->【Open Database】,选择需要查看的数据库文件即可。public class MyHelper extends SQLiteOpenHelper{ public MyHelper(Context context){ super(context, "itcast.db", null, 2); } // 数据库第一次创建时调用该方法 public void onCreate(SQLiteDatabase db){ //初始化数据库的表结构,执行一条建表的SQL语句 db.execSQL("CREATE TABLE information(_id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20), price INTEGER)") } // 当数据库的版本号增加时调用 public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){ } }
- 增加一条数据
注:使用完SQLiteDatabase对象后一定要调用close()方法关闭,否则数据库连接不存在会一直消耗内存。public void insert(String name,String price){ SQLiteDatabase db = helper.getWritableDatabase();//获取可以读写SQLiteDatabase对象 ContentValues values = new ContentValues(); //创建ContentValue对象 values.put("name",name); values.put("price",price); long id = db.insert("information",null,values);//插入一条数据到information表 db.close();//关闭数据库 }
- 修改一条数据
update()方法接收4个参数,第一个参数表示表名,第二个参数接收一个ContentValues对象,第三个参数为可选的where语句,第四个参数表示whereClause语句中表达式的占位参数列表,这些字符会替换掉where条件中的"?"。public int update(String name,String price){ SQLiteDatabase db = helper.getWritableDatabase();//获取可以读写SQLiteDatabase对象 ContentValues values = new ContentValues(); //创建ContentValue对象 values.put("price",price); int number = db.update("information", values, "name = ?", new String[]{name}); db.close(); return number; }
- 删除一条数据
删除数据不同于增加和修改数据,删除数据时不需要使用ContentValues来添加参数,而是使用一个字符串和一个字符串数组来添加参数名和参数值。public int delete(long id){ SQLiteDatabase db = helper.getWriteDatabase(); int number = db.delete("information", "_id = ?", new String[]{id + ""}); db.close(); return number; }
- 查询一条数据
在进行数据查询时使用的是query()方法,该方法返回的是一个行数集合Cursor。Cursor是一个游标接口,查询了遍历查询结果的方法,如移动指针方法move,获得列值方法getString()。
query()第一个参数表示表的名称,第二个参数表示查询的列名,第三个参数接收查询条件子句,第四个参数接收查询子句对应的条件值,第五个参数表示分组方式,第六个参数接收having条件,即定义组的过滤器,第七个参数表示排序方式。public boolean find(long id){ SQLiteDatabase db = helper.getWriteDatabase(); Cursor cursor = db.query("information",null,"_id=?",new String[]{id+""},null,null,null); boolean result = cursor.moveToNext(); cursor.close(); db.close(); return result; }
// 除了上述的db操作,还可以直接使用execSQL()方法通过SQL语句对数据库进行操作 //增加一条数据 db.execSQL("insert into information (name,price) values(?,?)",new Object[]{name,price}); //修改一条数据 db.execSQL("update information set name=? where price = ?", new Object[]{name,price}); //删除一条数据 db.execSQL("delete from information where _id = 1"); //执行查询的SQL语句 Cursor cursor = db.rawQuery("select * from person where name=?", new String[]{name}); //其中只有查询使用的rawQuery()方法,因为只有查询会返回一个Cursor,而execteSQL()方法是没有返回值的。
- SQLite中的事务
同一个事务的操作具备同步的特点,如果其中有一条语句无法执行,那么所有的语句都不会执行。
注:事务操作完成后一定要endTransaction()方法关闭事务。当执行到endTransaction()方法时,首先会检查是否有事务执行成功的标记,有则提交数据,无则回滚数据。并且要关闭事务,如果不关闭事务,事务只有到超时才自动结束,会降低数据库并发效率。PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext()); //获取一个可读写的SQLiteDatabase对象 SQLiteDatabase db = helper.getWriteableDatabase(); db.beginTransaction(); try{ //执行转出操作 db.execSQL("update person set account = account - 1000 where name = ?"new Object[]{"zhangsan"}); //执行转入操作 db.execSQL("update person set account = account + 1000 where name = ?"new Object[]{"wangwu"}); //标记数据库事务执行成功 db.setTransactionSuccessful(); } catch (Exception e){ Log.i("事务处理失败",e.toString()); } finally{ db.endTransaction();//关闭事务 db.close(); //关闭数据库 }
- ListView 控件
ListView是一个列表视图,由很多Item(条目),每个Item的布局都是相同的,这个Item布局会单独使用一个XML进行定义。需要注意的是,ListView指定了id属性之后,就会看到布局界面。-
BaseAdapter
BaseAdapter是基本的适配器。getCount(){};//得到Item条目的总数 getItem(){int position};// 根据position(位置)得到某个Item的对象 getItemId(int position);// 根据position(位置)得到某个Item的id getView(int position, View convertView,ViewGroup parent);//得到相应position对应的Item视图,position是当前Item的位置,convertView用于复用就视图,parent用于加载XML布局。
-
SimpleAdapter
public SimpleAdapter(Context context,List<? extends Map<String,?>>data, int resource,String[] from, int[] to);
Context context:Context: 上下文对象
List<? extends Map<String,?>>data: 数据集合,data中的每一项对应着ListView中的每一项的数据
int resource:Item 布局的资源id
String[] from:Map 集合里面的key值
int[] to:Item布局相应的控件id -
ArrayAdapter
public ArrayAdapter(Context context,int resource); public ArrayAdapter(Context context,int resource, int textViewResource); public ArrayAdapter(Context context,int resource, T[] objects); public ArrayAdapter(Context context,int resource, int textViewResourceId,T[] objects); public ArrayAdapter(Context context,int resource, TList<T> objects); public ArrayAdapter(Context context,int resource, int textViewResourceId,List<T> objects);
Context context:Context上下文对象。
int resource:Item 布局的资源id
int textViewResourceId:Item布局中相应TextView的id
T[] objects:需要适配的数据数组,数组类型数据
List<T>objects:List类型数据// 样例 // 重写getView()方法 @Override public View getView(int position,View convertView,ViewGroup parent){ View view = View.inflate(MainActivity.this,R.layout.list_item,null); TextView mTextView = (TextView) view.findViewById(R.id.item_tv); mTextView.setText(names[position]); ImageView imageView = (ImageView) view.findViewById(R.id.item_image); imageView.setBackgroundResource(icons[position]); return view; } MyBaseAdapter mAdapter = new MyBaseAdapter(); mListView.setAdapter(mAdapter);
-