智能移动设备软件开发复习-第三天

写在前面:仅供参考,一般是自己留着看的,如有错误,敬请指正。
这次的更新接着上次的博客,智能移动设备软件开发复习-第二天

第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();
      }
      }
      
    • 取出数据:
      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();
      }
      }
      
      取出数据时必须先用read()方法将文件内容读取到buffer缓冲区中,最后将读取到的内容转换成指定字符串。
  • SharedPreferences

    • 存储数据
      首先需要调用getSharedPreferences(String name,int mode)方法获取实例对象。由于该对象本身只能获取数据,不能对数据进行存储和修改,因此需要调用SharedPreference的edit()方法获取到可编辑的Editor对象,最后通过该对象的putString()方法和putInt()方法来存储数据:
      SharedPreferences sp = getSharedPreferences("data",MODE_PRIVATE);//其中的data为文件名
      SharedPreferences.Editor editor = sp.edit();
      editor.putString("name", "传智播客");
      editor.putInt("age", 8);
      editor.commit();
      
      注:操作完数据之后,一定要调用commit()方法进行数据提交,否则所有操作不生效。
    • 删除数据
      editor.remove("name");	//删除一条数据
      editor.clear();	//删除所有数据 
      
    • 获取数据
      SharePreferences sp  = getSharedPreferences("data",MODE_PRIVATE);
      String data = sp.getString("name","");
      
      get***()方法的第二个参数为缺省值,如果sp中不存在该key,将返回缺省值,例如getString(“name”,“”),若name不存在,则key就返回空字符串。
      注:获取数据的key值与存入数据的key值的数据类型要一致,否则查找不到数据
第5章 SQLite数据库
  • 数据库的创建
    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){
    	}
    }
    
    
    在Android系统中,数据库创建完成后是无法直接对数据进行查看的,要想要查看数据需要使用SQLite Expert Personal可视化工具。【File】 ->【Open Database】,选择需要查看的数据库文件即可。
  • 增加一条数据
    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();//关闭数据库
    }
    
    注:使用完SQLiteDatabase对象后一定要调用close()方法关闭,否则数据库连接不存在会一直消耗内存。
  • 修改一条数据
    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;
    }
    
    update()方法接收4个参数,第一个参数表示表名,第二个参数接收一个ContentValues对象,第三个参数为可选的where语句,第四个参数表示whereClause语句中表达式的占位参数列表,这些字符会替换掉where条件中的"?"。
  • 删除一条数据
    public int delete(long id){
    	SQLiteDatabase db = helper.getWriteDatabase();
    	int number = db.delete("information", "_id = ?", new String[]{id + ""});
    	db.close();
    	return number;
    }
    
    删除数据不同于增加和修改数据,删除数据时不需要使用ContentValues来添加参数,而是使用一个字符串和一个字符串数组来添加参数名和参数值。
  • 查询一条数据
    在进行数据查询时使用的是query()方法,该方法返回的是一个行数集合Cursor。Cursor是一个游标接口,查询了遍历查询结果的方法,如移动指针方法move,获得列值方法getString()。
    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;
    }
    
    query()第一个参数表示表的名称,第二个参数表示查询的列名,第三个参数接收查询条件子句,第四个参数接收查询子句对应的条件值,第五个参数表示分组方式,第六个参数接收having条件,即定义组的过滤器,第七个参数表示排序方式。
    // 除了上述的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中的事务
    同一个事务的操作具备同步的特点,如果其中有一条语句无法执行,那么所有的语句都不会执行。
    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(); //关闭数据库
    }
    
    注:事务操作完成后一定要endTransaction()方法关闭事务。当执行到endTransaction()方法时,首先会检查是否有事务执行成功的标记,有则提交数据,无则回滚数据。并且要关闭事务,如果不关闭事务,事务只有到超时才自动结束,会降低数据库并发效率。
  • ListView 控件
    ListView是一个列表视图,由很多Item(条目),每个Item的布局都是相同的,这个Item布局会单独使用一个XML进行定义。需要注意的是,ListView指定了id属性之后,就会看到布局界面。
    1. 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布局。
      
    2. 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

    3. 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);
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值