pull解析
创建一个asset目录
创建一个xml文件
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<map>
<qq>123456</qq>
<pwd>abc</pwd>
</map>
/*pull解析
* 1.获取xml文件对应的流
* getAssets();
* 2.初始化xml的pull解析器
* Xml.newPullParser();
* 3.绑定流数据
* parser.setinput(inputstream )
* 4.获取事件的类型
* int parser.geteventtype();
* 0 文档开始
* 2 标签开始
* 4 文本开始
* 3 标签结束
* 1 文档结束
* 5.循环遍历读取文档
* parser.next();让解析器跳到下一个事件中
* parser.getName();只是用来获取标签名,打印文本会卡住
* paiser.nextText();找到某个标签后面的wenben
* */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
AssetManager manager = getAssets();
InputStream fis = manager.open("qqinfo.xml");
XmlPullParser parser = Xml.newPullParser();
parser.setInput(fis,"utf-8");
int eventType = parser.getEventType();
while((eventType=parser.next())!=XmlPullParser.END_DOCUMENT){
if (eventType==XmlPullParser.START_TAG&&"qq".equals(parser.getName())) {
Log.v("meeee",parser.nextText());
}
if (eventType==XmlPullParser.START_TAG&&"pwd".equals(parser.getName())) {
Log.v("meeee",parser.nextText());
}
}
} catch (Exception e) {
}
}
SQLite数据库
1.创建一的类继承SQLiteOpenHelper
public class MyDpOpenHelper extends SQLiteOpenHelper {
public static final String DB_NAME = "contacts.db";
public static final int DB_VERSION=1;
/**
* @param name 数据库的名称
* @param factory 创建数据库游标对象的工厂 该参数可以q为null,形参可以删除
* @param version 版本 为int类型
*/
public MyDpOpenHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
/*当第一次创建数据库文件的时候被调用,在这里创建数据库表
* db.execSQL();
* */
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table contacts(_id integer primary key autoincrement,username text,number text);");
}
//当传入的数据库版本大于当前版本号的时候会调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
2.创建一个操作数据库的帮助类
/*建表语句
create table contactsinfo(_id integer primary key autoincrement,username text,number text);
insert into contacts(username,number) values ('张三','10000');
update contactsinfo set number ='10086' where username = '张三';
select number from contactsinfo where username = '张三';
delete from contactsinfo where username = '张三';*/
public class ContactDao {
//在构建起中传入一个DB类实例
private MyDpOpenHelper mHelper;
public ContactDao(Context c){
mHelper = new MyDpOpenHelper(c);
}
public void saveContacts(String name ,String pwd){
SQLiteDatabase db = mHelper.getWritableDatabase();
db.execSQL("insert into contacts(username,number) values (?,?);",new String[]{name,pwd});//?起占位符作用
}
public void updateContact(String name, String number){
SQLiteDatabase db = mHelper.getWritableDatabase();
db.execSQL("iupdate contactsinfo set number =? where username = ?;"
,new String[]{number,name});
}
/*ReaderableDatabase是可读可写, ReadableDatabase是只读的
* 1.创建爱你一个可读db对象
* 2.Cursor rawQuery = db.rawQuery 游标
* 3.让游标往下移动 读取游标指定行的数据
* cursor.getString(0); ()中的是列数
* */
public String queryContact(String name ){
SQLiteDatabase db = mHelper.getReadableDatabase();
// db.execSQL("select number from contactsinfo where username = ?;",new String[]{name});
Cursor cursor = db.rawQuery("select number from contactsinfo where username = ?;",new String[]{name});
while(cursor.moveToNext()){
String number = cursor.getString(0);
return number;
}
return null;
}
public void deleteContacts(String name){
SQLiteDatabase db = mHelper.getWritableDatabase();
db.execSQL("delete from contactsinfo where ? = '张三';",new String[]{name});
}
}
/*创建一个数据库文件
* 1.首先创建一个数据库帮助类,用来实现各种数据库的操作
* 2.获取数据库
* ` 1.dbhelper.getReadableDatabase();
* 1.返回的SQLiteDatabase可以用来操作数据库
* 2.只要该方法被调用,那么就会出现数据库文件(在文件不存在的情况下创建)
* 3.使用夜神模拟器会出现x.jour-dp(事务文件)
* 2.dbhelper.getWritableDatabase();
* */
mDao = new ContactDao(this);
MyDpOpenHelper dbhelper =new MyDpOpenHelper(this);
//readable 和writedata可以近似看作相等的,read会首先尝试调用write的数据,失败时返回只读数据库
SQLiteDatabase readdb = dbhelper.getReadableDatabase();
SQLiteDatabase wdb = dbhelper.getWritableDatabase();
Litepal的使用
1.导包
Gradle:
compile 'org.litepal.android:core:1.5.1'
2.在asset目录下创建一个litepal.xml,通过反射实现
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<!-- 指定数据库文件的名称 -->
<dbname value="users" />
<!-- 指定数据库的版本 -->
<version value="1" />
<--对象映射-->
<list>
<mapping class="com.example.UserInfo" />
</list>
</litepal>
3.创建一个bean类继承于DataSupport
public class UserInfo extends DataSupport {
private String username;
private String phone;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
4.在manifest中配置application的name属性
<application
android:name="com.example.LitePalApplication"
不过这样就无法自定义application了
为此,也可以这样:
<application
android:name="com.example.MyApplication"
但还需要
public class MyApplication extends AnotherApplication {
@Override
public void onCreate() {
super.onCreate();
LitePal.initialize(this);
}
}
5.操作方法
/*
CREATE TABLE song (
id integer primary key autoincrement,
username text ,
phone text,
);
*/
SQLiteDatabase db = LitePal.getDatabase();
/*
创建对象,并save
*/
Album album = new Album();
album.setName("album");
album.setPrice(10.99f);
album.setCover(getCoverImageBytes());
album.save();
//更新操作
Album albumToUpdate = DataSupport.find(Album.class, 1);
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.save();
也可以这样更新
Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.update(id);
更新全部
Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.updateAll("name = ?", "album");
//删除操作
DataSupport.delete(Song.class, id);
DataSupport.deleteAll(Song.class, "duration > ?" , "350");
//查询操作
Song song = DataSupport.find(Song.class, id);
List<Song> allSongs = DataSupport.findAll(Song.class);
List<Song> songs = DataSupport.where("name like ?", "song%").order("duration").find(Song.class);
//因为是通过反射来实例化数据库的,所以在混淆时候一定一定要记得,不要问我为什么知道的Q_Q
-keep class org.litepal.** {
*;
}
-keep class * extends org.litepal.crud.DataSupport {
*;
}