Android基础_Xml的Pull解析/安卓中的数据库以及实例化数据库的第三方框架Litepal(五)

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 {
    *;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值