无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
1.android下junit测试框架配置
单元测试需要在手机中进行安装测试
(1).在清单文件中manifest节点下配置如下节点
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.demo1" />
上面targetPackage指定的包要和应用的package相同。
(2)在清单文件中application节点下配置如下节点
<uses-library
android:name="android.test.runner"/>
(3).编写业务逻辑类
package com.example.demo1.service; public class UserService {
public int add(int x, int y) {
return x + y;
}
}
(4).编写单元测试类,该类继承 AndroidTestCase
package com.example.demo1.test; import com.example.demo1.service.UserService; import android.test.AndroidTestCase; public class TestUserService extends AndroidTestCase {
public void testAdd() throws Exception {
UserService us = new UserService();
int result = us.add(3, 5);
assertEquals(8, result);
}
}
选择要测试的方法,右键点击“Run As”--“Android Junit Test” 2.保存文件到手机内存
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请输入用户名" /> <EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="wrap_content" > <requestFocus />
</EditText> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请输入密码" /> <EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword" /> <RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content" > <CheckBox
android:id="@+id/cb_remember_psw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="记住密码" /> <Button
android:onClick="login"
android:layout_alignParentRight="true"
android:id="@+id/login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录" />
</RelativeLayout> </LinearLayout> package com.example.demo1; import java.util.HashMap; import com.example.demo1.service.LoginService; import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast; public class LoginUIActivity extends Activity {
private EditText et_username = null;
private EditText et_password = null;
private CheckBox cb_remeber_password = null; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login_ui);
this.et_username = (EditText) this.findViewById(R.id.et_username);
this.et_password = (EditText) this.findViewById(R.id.et_password);
this.cb_remeber_password = (CheckBox) this.findViewById(R.id.cb_remember_psw);
HashMap<String, String> info = LoginService.getInfo(this);
if (info != null) {
this.et_username.setText(info.get("username"));
this.et_password.setText(info.get("password"));
}
} public void login(View view) {
String username = this.et_username.getText().toString().trim();
String password = this.et_password.getText().toString().trim();
if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
Toast.makeText(this, "用户名或密码不能为空", 0).show();
} else {
if (this.cb_remeber_password.isChecked()) {
boolean result = LoginService.saveInfo(this, username, password);
if (result) {
Toast.makeText(this, "保存密码成功", 0).show();
}
}
if ("weijie".equals(username) && "123".equals(password)) {
Toast.makeText(this, "登录成功", 0).show();
} else {
Toast.makeText(this, "登录失败", 0).show(); }
}
}
} package com.example.demo1.service; import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.HashMap; import android.content.Context;
import android.widget.Toast; public class LoginService { public static boolean saveInfo(Context context, String username,
String password) {
// getFileDir : /data/data/包名/files
// getCacheDir : /data/data/包名/cache
File file = new File(context.getFilesDir(), "info.txt");
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write((username + "=" + password).getBytes());
fos.flush();
fos.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
} public static HashMap<String, String> getInfo(Context context) {
File file = new File(context.getFilesDir(), "info.txt"); try {
if (file.exists()) {
FileInputStream fis = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String[] result = br.readLine().split("=");
HashMap<String, String> map = new HashMap<String, String>();
map.put("username", result[]);
map.put("password", result[]);
br.close();
return map;
}
} catch (Exception e) {
Toast.makeText(context, "无法读取用户信息", 0).show(); }
return null;
}
} 3.android下文件访问的权限
利用Context提供的参数,我们可以设置文件不同访问权限
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入:
openFileOutput("info.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
4.保存文件到SD卡
package com.example.demo1.service; import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.HashMap; import android.content.Context;
import android.os.Environment;
import android.widget.Toast; public class LoginService1 { public static boolean saveInfo(Context context, String username,
String password) { try {
if (Environment.MEDIA_MOUNTED.equals(Environment
.getExternalStorageState())) {
File file = new File(Environment.getExternalStorageDirectory(),
"info.txt");
FileOutputStream fos = new FileOutputStream(file);
fos.write((username + "=" + password).getBytes());
fos.flush();
fos.close();
return true;
} else {
Toast.makeText(context, "cdcard被卸载", 0).show();
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
} public static HashMap<String, String> getInfo(Context context) {
File file = new File(Environment.getExternalStorageDirectory(),
"info.txt");
try {
FileInputStream fis = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String[] result = br.readLine().split("=");
HashMap<String, String> map = new HashMap<String, String>();
map.put("username", result[]);
map.put("password", result[]);
br.close();
return map; } catch (Exception e) {
Toast.makeText(context, "无法读取用户信息", 0).show(); }
return null;
}
} <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 5.分析setting源代码获取SD卡大小
public String getSdcardInfo() {
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
long availableBlocks = stat.getAvailableBlocks(); long totalSize = blockSize * totalBlocks;
long availSize = blockSize * availableBlocks; String totalStr = Formatter.formatFileSize(LoginUIActivity.this,
totalSize);
String availStr = Formatter.formatFileSize(LoginUIActivity.this,
availSize);
return "cdcard总内存:" + totalStr + "\n" + "可用内存:" + availStr; } public String getROMInfo() {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
long availableBlocks = stat.getAvailableBlocks();
long totalSize = blockSize * totalBlocks;
long availSize = blockSize * availableBlocks; String totalStr = Formatter.formatFileSize(LoginUIActivity.this,
totalSize);
String availStr = Formatter.formatFileSize(LoginUIActivity.this,
availSize);
return "手机总内存:" + totalStr + "\n" + "可用内存:" + availStr; } 6.使用SharedPreferences进行数据存储
(1)保存信息,会生成config.xml文件,一般用来保存配置信息的
SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
Editor editor = sp.edit();
editor.putString("username", username);
editor.putString("password", password);
editor.commit();
(2)获取信息
SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
sp.getString("username", "");
sp.getString("password", ""); 7.使用Pull解析器生成XML文件
public void save(View view) {
XmlSerializer xmlSerializer = Xml.newSerializer();
File file = new File(Environment.getExternalStorageDirectory(),
"config.xml");
try {
FileOutputStream fos = new FileOutputStream(file);
xmlSerializer.setOutput(fos, "utf-8");
xmlSerializer.startDocument("utf-8", true); xmlSerializer.startTag(null, "smss"); for (SmsInfo info : infos) {
xmlSerializer.startTag(null, "sms");
xmlSerializer.attribute(null, "id", info.getId() + ""); xmlSerializer.startTag(null, "date");
xmlSerializer.text(info.getDate() + "");
xmlSerializer.endTag(null, "date"); xmlSerializer.startTag(null, "address");
xmlSerializer.text(info.getAddress());
xmlSerializer.endTag(null, "address"); xmlSerializer.startTag(null, "body");
xmlSerializer.text(info.getBody());
xmlSerializer.endTag(null, "body");
xmlSerializer.endTag(null, "sms");
}
xmlSerializer.endTag(null, "smss"); xmlSerializer.endDocument();
fos.close();
Toast.makeText(this, "保存成功", 0).show(); } catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "保存失败", 0).show();
}
} 8.采用pull解析器解析xml文件
(1).准备一个xml文件,将其拷贝到工程的src目录下
<?xml version="1.0" encoding="utf-8"?>
<infos>
<city id="1">
<temp>20'C/30'C</temp>
<weather>多云</weather>
<wind>南风3级</wind>
<name>上海</name>
<pm>200</pm>
</city> <city id="2">
<temp>20'C/35'C</temp>
<weather>暴雨</weather>
<wind>南风10级</wind>
<name>北京</name>
<pm>800</pm>
</city> <city id="3">
<temp>0'C/10'C</temp>
<weather>暴雪</weather>
<wind>北风32级</wind>
<name>广州</name>
<pm>200</pm>
</city> </infos>
(2)
public static ArrayList<WeatherInfo> getWeatherInfo(InputStream is)
throws Exception {
ArrayList<WeatherInfo> infos = null;
WeatherInfo info = null; // XmlPullParser parser = Xml.newPullParser(); XmlPullParserFactory fac = XmlPullParserFactory.newInstance();
XmlPullParser parser = fac.newPullParser(); parser.setInput(is, "utf-8");
int type = parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG:
if ("infos".equals(parser.getName())) {
infos = new ArrayList<WeatherInfo>();
} else if ("city".equals(parser.getName())) {
info = new WeatherInfo();
info.setId(Integer.parseInt(parser.getAttributeValue(0)));
} else if ("temp".equals(parser.getName())) {
info.setTemp(parser.nextText());
} else if ("weather".equals(parser.getName())) {
info.setWeather(parser.nextText());
} else if ("wind".equals(parser.getName())) {
info.setWind(parser.nextText());
} else if ("name".equals(parser.getName())) {
info.setName(parser.nextText());
} else if ("pm".equals(parser.getName())) {
info.setPm(parser.nextText());
}
break; case XmlPullParser.END_TAG:
if ("city".equals(parser.getName())) {
infos.add(info);
info = null;
}
break;
}
type = parser.next();
}
return infos; } (3).调用
public class WeatherActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv_info = (TextView) this.findViewById(R.id.vt_info); try {
ArrayList<WeatherInfo> infos = WeaterService
.getWeatherInfo(WeatherActivity.class.getClassLoader()
.getResourceAsStream("weather.xml"));
StringBuffer sb = new StringBuffer();
for (WeatherInfo info : infos) {
sb.append(info);
sb.append("\n");
}
tv_info.setText(sb.toString());
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "xml解析失败", 0).show();
} }
} 9.android下创建一个sqlite数据库
public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {
private static final String DBFILENAME = "person.db";
private static int db_version = 2; public PersonSQLiteOpenHelper(Context context) {
super(context, DBFILENAME, null, db_version);
} /**
* 当数据库第一次创建时调用
*/
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table person(id integer primary key autoincrement,name varchar(20),number varchar(20))";
db.execSQL(sql);
} /**
* 当数据库的版本号发生增加的时候调用
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("数据库更改!");
String sql = "alter table person add account varchar(20)";
db.execSQL(sql);
} } 10.sql语句实现数据库的增删改查
(1)添加条目
public void add(String name, String number) {
SQLiteDatabase db = this.helper.getWritableDatabase();
db.execSQL("insert into person(name,number) values(?,?)", new Object[] {
name, number });
db.close();
} (2).查找条目是否存在
public boolean find(String name) {
SQLiteDatabase db = this.helper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from person where name=?",
new String[] { name });
boolean result = cursor.moveToNext();
cursor.close();
db.close();
return result;
} (3).更新条目
public void update(String name, String newNumber) {
SQLiteDatabase db = this.helper.getWritableDatabase();
db.execSQL("update person set number=? where name=?", new Object[] {
newNumber, name });
db.close();
} (4).删除条目
public void delete(String name) {
SQLiteDatabase db = this.helper.getWritableDatabase();
db.execSQL("delete from person where name=?", new Object[] { name });
db.close();
} (5).查找所有条目
public ArrayList<Person> findAll() {
SQLiteDatabase db = this.helper.getReadableDatabase();
ArrayList<Person> persons = new ArrayList<Person>();
Cursor cursor = db.rawQuery("select * from person", null);
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String number = cursor.getString(cursor.getColumnIndex("number"));
Person p = new Person(id, name, number);
persons.add(p);
}
cursor.close();
db.close();
return persons;
} 11.系统api实现数据库的增删改查&sqlite3工具的使用
(1).添加条目
public long add(String name, String number) {
SQLiteDatabase db = this.helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("number", number);
long id = db.insert("person", null, values);
db.close();
return id;
} (2).查找条目是否存在
public boolean find(String name) {
SQLiteDatabase db = this.helper.getReadableDatabase();
Cursor cursor = db.query("person", null, "name=?",
new String[] { name }, null, null, null);
boolean result = cursor.moveToNext();
cursor.close();
db.close();
return result;
} (3).更新条目
public int update(String name, String newNumber) {
SQLiteDatabase db = this.helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("number", newNumber);
int number = db.update("person", values, "name=?",
new String[] { name });
db.close();
return number;
} (4).删除条目
public int delete(String name) {
SQLiteDatabase db = this.helper.getWritableDatabase();
// db.execSQL("delete from person where name=?", new Object[] { name });
int number = db.delete("person", "name=?", new String[] { name });
db.close();
return number;
} (5).查找所有条目
public ArrayList<Person> findAll() {
SQLiteDatabase db = this.helper.getReadableDatabase();
ArrayList<Person> persons = new ArrayList<Person>();
Cursor cursor = db.query("person", null, null, null, null, null, null);
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String number = cursor.getString(cursor.getColumnIndex("number"));
Person p = new Person(id, name, number);
persons.add(p);
}
cursor.close();
db.close();
return persons; }
12.使用事务操作SQLite数据库
SQLiteDatabase db = this.helper.getReadableDatabase();
db.beginTransaction();//开始事务
try {
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"张三", 4});
db.execSQL("update person set name=? where personid=?", new Object[]{"李四", 1});
db.setTransactionSuccessful();//调用此方法会在执行到endTransaction() 时提交当前事务,如果不调用此方法会回滚事务
} finally {
db.endTransaction();//由事务的标志决定是提交事务,还是回滚事务
}
db.close();
无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)的更多相关文章
- 使用Pull解析器生成XML文件和读取xml文件
有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...
- 使用Pull解析器生成XML文件
有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...
- Android开发8——利用pull解析器读写XML文件
一.基本介绍 对XML解析有SAX和DOM等多种方式,Android中极力推荐xmlpull方式解析xml.xmlpull不仅可用在Android上同样也适用于javase,但在javase环境中需自 ...
- [android] android下junit测试框架配置
我们的业务代码一般是放在一个新的包下面,这个业务类不能够通过右键run as java application,因为android项目只能运行在手机上的dalvak虚拟机里面 新建一个包,里面写测试类 ...
- Android(java)学习笔记187:Android中操作XML数据(使用Pull解析器)
1. Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, Pull解析器 ...
- Android(java)学习笔记130:Android中操作XML数据(使用Pull解析器)
1. Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, Pull解析器 ...
- 通过pull解析器操作安卓的xml
通过pull解析器操作安卓的xml 例子定义了一个javabean用于存放上面解析出来的xml内容, 这个javabean为Person,代码请见本页下面备注: =================== ...
- Android Junit测试框架
对应用进行单元测试: 使用Junit测试框架,是正规Android开发的必用技术.在Junit中可以得到组件,可以模拟发送事件和检测程序处理的正确性. 1.配置指令集和函数库: (1)配置指令集,指定 ...
- 黎活明8天快速掌握android视频教程--15_采用Pull解析器解析和生成XML内容
1.该项目主要有下面的两个作用 (1)将xml文件解析成对象的List对象,xml文件可以来自手机本地,也可以来自服务器返回的xml数据 (2)强list对象保存成xml文件,xml保存到手机的内存卡 ...
随机推荐
- JNI_Android项目中调用.so动态库实现详解
转自:http://www.yxkfw.com/?p=7223 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.java package com.wwj. ...
- c++ 字符串流 sstream(常用于格式转换) 【转载】
使用stringstream对象简化类型转换C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性.类型安全和可扩展性.在本文中, ...
- String与InputStream互转的几种方法
[java] view plain copy /** * 利用BufferedReader实现Inputstream转换成String <功能详细描述> * * @param in * @ ...
- Java WebClient 总结
private WebClient getAWebClient() { WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24); ...
- WebApp的前端所遇问题
2015年10月1日至10月25日,两个本科生和一位研究生以及一位老师组成四人团队,开发某教育前端项目 所遇问题总结以及分享: 一.主要应用软件:sublime_text HBuilder 初学者可以 ...
- lenovo c340 centos 改键【尚无解】
公司给陪了个一体机. 键盘很无语,fn的位置在左下角.反人类设计. 破解: 1. bios,不幸不支持. 2. 改建: http://www.bitscn.com/hardware/nb/437603 ...
- centos 安装gcc时,出错:Found 10 pre-existing rpmdb problem(s), 'yum check' output follows:
别人折腾的系统. 刚开始,准备安装下tornado,报错,需要安装 gcc 和 python-devel gcc安装报错,如标题所示: 谷歌了一把: http://stackoverflow.com/ ...
- Glyphicons字体图标
Glyphicons字体图标-----好处可以减少请求,容易控制样式! <p> <button type="button" class="btn btn ...
- IPC----消息队列
消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识.具有足够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息.在某个进程 ...
- mysql性能优化学习笔记-存储引擎
mysql体系架构 客户端(java.php.python等) mysql服务层(连接管理器.查询解析器.查询优化器.查询缓存) mysql存储引擎(innodb.myisam等) 存储引擎针对表而言 ...