Android学习(五)

数据存储

文件存储

写入数据到文件。

在Context类中提供了一个openFileOutput()方法 ,可以用于将数据存储到指定的文件中,这个方法接受两个参数, 第一个参数是文件名, 在文件创建的时候使用的就是这个名称,这个指定的文件名不可以包含路径, 因为所有的文件都是默认存储在 /data/data/<包名>/files/
目录下的。第二个参数是文件的操作模式,主要有两种模式可以选择。 MODE_PRIVATEMODE_APPEND,其中 MODE_PRIVATE 是默认的操作模式,表示当前指定同样文件的时候,所写入的内容会覆盖源文件中的内容,而MODE_APPEND则表示如果该文件已经存在,就在这个文件中追加内容,不存在就创建这个文件,

openFileOutput()方法返回的是一个FIleOutputStream对象,得到这个对象之后就可以使用java中的流方式将数据写入到文件中了。

public class MainActivity extends AppCompatActivity {
    EditText et_text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_text = (EditText) findViewById(R.id.et_text);

    }

    @Override
    protected void onDestroy() {    //关闭程序时 保存数据
        super.onDestroy();
        String text = et_text.getText().toString();
        save(text);
    }


    public void save(String text){
        FileOutputStream out = null;
        BufferedWriter writer = null;
        try {
            out = openFileOutput("data", Context.MODE_PRIVATE); //创建data文件设定模式为PRIVATE
            writer = new BufferedWriter(new OutputStreamWriter(out)); //将字节流转换成字符流
            writer.write(text);//写入数据
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(writer != null)
                   writer.close();
                if(out != null)
                    out.close();
            }catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

从文件中读取数据

与openFileoutput()对应 Context中还提供了一个openFileInput() 方法, 他之接受一个参数,就是要读取的文件名, 然后系统会自动到/data/data/<包名>/files目录下去加载这个文件, 并返回一个FileInputStream对象,得到这个对象之后在通过Java流的方式就可以将数据读取出来了。

public class MainActivity extends AppCompatActivity {
    EditText et_text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_text = (EditText) findViewById(R.id.et_text);
        load();

    }

    @Override
    protected void onDestroy() {    //关闭程序时 保存数据
        super.onDestroy();
        String text = et_text.getText().toString();
        save(text);
    }

    public void load(){
        InputStream in = null;
        FileOutputStream out = null;
        StringBuffer sb = new StringBuffer("");
        try {
            in = openFileInput("data");

            byte []data = new byte[3];
            int len = 0;
            while((len=in.read(data,0,data.length)) !=-1){

                sb.append(new String(data,0,len,"UTF-8"));
                Log.i("TEST", "load: "+sb.toString());

            }
            et_text.setText(sb);

        } catch (FileNotFoundException e ) {
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }


    }

    public void save(String text){
        FileOutputStream out = null;
        BufferedWriter writer = null;
        try {
            out = openFileOutput("data", Context.MODE_PRIVATE); //创建data文件设定模式为PRIVATE
            writer = new BufferedWriter(new OutputStreamWriter(out)); //将字节流转换成字符流
            writer.write(text);//写入数据
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(writer != null)
                   writer.close();
                if(out != null)
                    out.close();
            }catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

SharedPerferences

不同于文件的存储方式, SharedPerferences是使用了键值对的方式来存储数据的, 也就是说当保存一条数据的时候, 需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把对应的值取出来, 而且,SharedPerferences还支持多种不同的数据类型存储, 如果存储的类型是整形,那么读取出来的时候也是整形,如果存储的数据是一个字符串,那么读取的时候读出来的也是一个字符串。

  1. 将数据存储到SharedPerferences中,

    如果向使用SharedPerferences来存储数据, 首先要获取到SharedPerferences对象。,Android中提供了三种方法用于得到SharedPerferences

    1. Context类中的getSharedPerferences()方法
      这个方法接受两个参数,第一个参数用于指定,SharedPerferences文件的名称如果文件不存在则会创建一个这个文件,第二个参数是指定的操作模式,目前只有MODE_PRIVATE这一种模式可选, 他就是默认的操作模式,和直接传入0的效果是相同的, 表示只有当前的应用程序才可以对这个文件进行读写,其他的集中操作模式均已经被遗弃。

    2. Activity类中的getSharedPerferences()方法
      这个方法和Context中的getPerferences()方法很相似, 不过他只接受一个操作模式参数, 因为使用这个方法是会自动将当前活动的类名作为SharedPerferences的文件名

    3. PerferenceManager类中的getDefaultSharedPreferences()方法。
      这是一个静态方法,他接受一个Context参数,并自动使用当前的应用程序的包名作为前缀来命名SharedPreferences文件,得到了SharedPreferences对象后,就可以开始向SharedPreferences文件中存储数据了,主要可以分为三步

      1. 调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象
      2. 向SharedPreferences.Editor对象中添加数据, 比如添加一个布尔类型数据就使用putBoolean()方法,添加一个字符串就使用putString()方法 ...
      3. 调用apply()方法将添加的数据提交,从而完成数据存储操作。

      Example:

      布局文件:

      <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">
          <EditText
              android:id="@+id/et_text"
              android:hint="请输入你要保存的数据"
              android:layout_width="match_parent"
              android:layout_height="wrap_content" />
          <Button
              android:id="@+id/btn_save"
              android:text="保存数据"
              android:layout_width="match_parent"
              android:layout_height="wrap_content" />
      </LinearLayout>
      

      MainActivity:

      public class MainActivity extends AppCompatActivity {
          Button btn_save;
          EditText et_text;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              btn_save = (Button) findViewById(R.id.btn_save);
              et_text = (EditText) findViewById(R.id.et_text);
      
              btn_save.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      SharedPreferences.Editor editor = getSharedPreferences("data", Context.MODE_PRIVATE).edit();
                      editor.putString("text",et_text.getText().toString());
                      editor.apply();
                  }
              });
          }
      }
      
  2. 从SharedPreferences中读取数据。

    SharedPreferences对象中提供了一系列的get方法,用于对存储的数据进行读取,每种get方法都对应了SharedPreferences.Editor中的一种put方法,比如读取一个布尔型数据就使用getBoolean()方法,读取一个String类型数据就使用getString()方法, 这些方法由两个参数,第一个参数是键,第二个参数是如果没有找到这个键会以什么样的默认值进行返回。

    SharedPreferences sharedPreferences = getSharedPreferences("data",Context.MODE_PRIVATE);
    String text = sharedPreferences.getString("text","");
    et_text.setText(text);
    

实现记住密码功能。

布局文件:

<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <LinearLayout
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:text="用户名"
            android:gravity="center"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
        <EditText
            android:id="@+id/et_username"
            android:padding="15dp"
            android:layout_weight="4"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:text="密码"
            android:gravity="center"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
        <EditText
            android:id="@+id/et_passwd"
            android:padding="15dp"
            android:layout_weight="4"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:paddingLeft="20dp"
        android:paddingTop="20dp"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <CheckBox
            android:id="@+id/cb_rember"
            android:text="记住密码"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:padding="20dp"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <Button
            android:id="@+id/btn_login"
            android:text="登录"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
</LinearLayout>

MainActivity:

public class MainActivity extends AppCompatActivity {

    CheckBox cb_rember;
    Button btn_login;
    EditText et_username;
    EditText et_passwd;

    SharedPreferences.Editor editor;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();

        SharedPreferences sharedPreferences = getSharedPreferences("username_passwd",Context.MODE_PRIVATE);
        boolean is_rember = sharedPreferences.getBoolean("is_rember",false);
        if(is_rember){
            String username = sharedPreferences.getString("username","");
            String passwd = sharedPreferences.getString("passwd","");
            Log.i("TEST", "onCreate: "+username +"----"+passwd);
            et_username.setText(username);
            et_passwd.setText(passwd);
            cb_rember.setChecked(is_rember);
        }


        btn_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //这里应该先判断账号密码是否正确然后在进行判断是否记住密码。否则记住密码也没有用。
                if(cb_rember.isChecked()){//如果保存密码选中了。
                    editor.putString("username",et_username.getText().toString());
                    editor.putString("passwd", et_passwd.getText().toString());
                    editor.putBoolean("is_rember",true);
                    //开启下一个Activity  ... 其他操作。
                }
                else{
                    editor.clear(); //如果没有选择记住密码则清空保存的键值对
                }
                editor.apply();
            }
        });


    }

    public void initView(){
        cb_rember = (CheckBox) findViewById(R.id.cb_rember);
        btn_login = (Button) findViewById(R.id.btn_login);
        et_passwd = (EditText)findViewById(R.id.et_passwd);
        et_username = (EditText)findViewById(R.id.et_username);
        editor = getSharedPreferences("username_passwd",Context.MODE_PRIVATE).edit();
    }
}

SQLite数据库存储。

Android为了让我们能够更加方便的管理数据库 ,专门提供了以个SQLiteOpenHelper帮助类, 借助这个类就可以非常简答的对数据库进行创建和升级。

SQLiteOpenHelper是一个抽象类, 这意味着,如果我们想要使用他的化, 就需要创建一个自己的帮助类去继承他, SQLiteOpenHelper中由两个抽象方法,分别是 onCreate()onUpgrade()我们必须在自己的帮助了中重写这两个方法, 然后分别在这两个方法中实现创建和升级数据库的逻辑。
SQLiteOpenHelper中还有两个非常重要的实例方法,getReadableDatabase()getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库。(如果数据库已存在则直接打开,否则创建一个新的数据库。 )并返回一个可对数据看进行读写操作的对象,不同的是,当数据库不可写入的时候,getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWriteableDatabase()方法则会直接抛出异常。
SQLiteOpenHelper中由两个构造方可供重写, 一般使用参数少的那个构造方法,这个构造方法中接受4个参数, 第一个参数是Context,第二个参数是数据库名,创建数据库时使用的就是这里指定的名称, 第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null,第四个参数表示当前数据看的版本号,可以用于数据库进行升级操作,构建出SQLiteOpenHelper的实例后在调用它的getReadableDatabase()或者getWriteableDatabase()方法就能创建数据了数据库文件会存放在/data/data/<包名>/database目录下,此时重写的onCreate()方法会得到执行,所以通常会在这里去处理一些创建表的逻辑。

  1. 新建一个MyDatabaseHelper类 然后继承SQLiteOpenHelper

    public class MyDatabaseHelper extends SQLiteOpenHelper {
        public static final String  CREATE_TABLE_BOOK = "create table Book(" +
                "id integer primary key autoincrement," +
                "author text ," +
                "price real ," +
                "pages integer," +
                "name text" +
                ")";
        private Context context;
        public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
            this.context = context;
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_TABLE_BOOK);
            Toast.makeText(context, "建表成功", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    }
    
  2. 布局文件:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <Button
            android:id="@+id/btn_create_table_book"
            android:text="创建数据表"
            android:layout_height="wrap_content"
            android:layout_width="match_parent" />
    
    
    </LinearLayout>
    

    3.MainActivity:

    public class MainActivity extends AppCompatActivity {
    
        Button btn_create_table_book;
        MyDatabaseHelper myDatabaseHelper;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btn_create_table_book = (Button) findViewById(R.id.btn_create_table_book);
    
            myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null ,1);
    
            btn_create_table_book.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    myDatabaseHelper.getWritableDatabase();
                }
            });
    
        }
    }
    

点击按钮后就可以看到在databases文件夹中出现了BookStore.db。

  1. 升级数据库

    目前在项目中已经有一张Book表用于存放书的各种详细的数据,如果我们想要再添加一张Category表就需要在MyDatabaseHelper类中重写onUpgrade()方法, 并且在new MyDatabaseHelper(this,"BookStore.db",null ,1);时候的最后一个参数版本号指定为其他数值,就可以了。

  2. 添加数据

    在调用getReadableDatabase()方法或者getWritableDatabase()方法会返回一个SQLiteDatabase对象。 借助这个对象可以对数据进行CRUD操作。SQLiteDatabase提供了一个insert()方法 这个方法接收3个参数, 第一个参数是表名,第二个参数是用于在未指定添加数据的情况下给某些可为空的列自动赋值NULL一般用不到这个功能,直接传入NULL就可以了,第三个参数是一个ContentValues对象, 它提供了一系列put()方法重载,用于向ContentValues中添加数据,

    修改MainActivity中的代码:

    public class MainActivity extends AppCompatActivity {
    
        Button btn_create_table_book;
        MyDatabaseHelper myDatabaseHelper;
        Button btn_insert_value;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btn_create_table_book = (Button) findViewById(R.id.btn_create_table_book);
            btn_insert_value = (Button) findViewById(R.id.btn_insert_value);
    
            myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null ,2);
    
            btn_create_table_book.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    myDatabaseHelper.getWritableDatabase();
    
                }
            });
    
            btn_insert_value.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    SQLiteDatabase database = myDatabaseHelper.getWritableDatabase();
                    ContentValues cv = new ContentValues();
                    cv.put("name","the da vinci code");
                    cv.put("author","Dan Brown");
                    cv.put("price",16.69);
                    database.insert("Book",null,cv);
                }
            });
    
    
        }
    }
    
  3. 更新数据
    1. 使用update()方法 这个方法提供了4个参数,第一个参数是表名, 第二个参数是ContentValues对象, 要把更新数据在这里组装进去,第三个和第四个参数用于约束更新某一行或者某几行数据, 不指定的话默认更新所有行。
  4. 删除数据

    1. 使用delete()方法 这个方法提供了三个参数, 第一个参数是表明, 第二和第三个参数是用于约束删除某一行或者某几行, 不指定的化默认是删除所有行。
  5. 查询数据。
    使用query()方法,

    public  Cursor query(String table,String[] columns,String selection,String[]  selectionArgs,String groupBy,String having,String orderBy,String limit);
    

    各个参数的意义说明:

    参数table:表名称
    参数columns:列名称数组
    参数selection:条件字句,相当于where
    参数selectionArgs:条件字句,参数数组
    参数groupBy:分组列
    参数having:分组条件
    参数orderBy:排序列
    参数limit:分页查询限制
    返回值Cursor:相当于结果集ResultSet
    

    Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.

    Cursor游标常用方法

    getCount()    获得总的数据项数
    isFirst()    判断是否第一条记录
    isLast()    判断是否最后一条记录
    moveToFirst()    移动到第一条记录
    moveToLast()    移动到最后一条记录
    move(int offset)    移动到指定记录
    moveToNext()    移动到下一条记录
    moveToPrevious()    移动到上一条记录
    getColumnIndexOrThrow(String  columnName)    根据列名称获得列索引
    getInt(int columnIndex)    获得指定列索引的int类型值
    getString(int columnIndex)    获得指定列缩影的String类型值
    
  6. 在布局文件中再添加一个按钮 用于查询数据 然后修改MainActivity中的代码:

    public class MainActivity extends AppCompatActivity {
    
        Button btn_create_table_book;
        MyDatabaseHelper myDatabaseHelper;
        Button btn_insert_value;
        Button btn_select_value;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btn_create_table_book = (Button) findViewById(R.id.btn_create_table_book);
            btn_insert_value = (Button) findViewById(R.id.btn_insert_value);
            btn_select_value = (Button) findViewById(R.id.btn_select_value);
    
            myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null ,2);
    
            btn_create_table_book.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    myDatabaseHelper.getWritableDatabase();
    
                }
            });
    
            btn_insert_value.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    SQLiteDatabase database = myDatabaseHelper.getWritableDatabase();
                    ContentValues cv = new ContentValues();
                    cv.put("name","the da vinci code");
                    cv.put("author","Dan Brown");
                    cv.put("price",16.69);
                    database.insert("Book",null,cv);
                }
            });
    
            btn_select_value.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    SQLiteDatabase database = myDatabaseHelper.getWritableDatabase();
                    Cursor cur = database.query("Book",null,null,null,null,null,null);
                    while(cur.moveToNext()){
                        String name = cur.getString(cur.getColumnIndex("name"));
                        String author = cur.getString(cur.getColumnIndex("author"));
                        double price = cur.getDouble(cur.getColumnIndex("price"));
    
                        Log.d("MainActivity", name);
                        Log.d("MainActivity", author);
                        Log.d("MainActivity", String.valueOf(price));
                    }
                }
            });
    
    
        }
    }
    

使用sql操作数据库。

虽然Android已经给我们提供了很多方便的API用于操作数据库。但是有些功能是不能够实现的,
使用SQL来实现前面的CRUD操作

添加数据的方法如下:

db.execSQL("insert into Book (name,author,pages,price)values(?,?,?,?)", new String[]("书名","作者","10","20.0"));

更新数据的方法如下:

db.execSQL("update Book set price = ? where name = ?" new String[]("200.0",“书名”))

删除数据的方法如下

db.execSQL("delete from Book where pages>? " new String[]("500"))

查询数据的方法如下:

db.rawQuery("select * from Book",null);

使用LitePal操作数据库

LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平时开发中最常用的一些数据库功能进行了封装,是的不用编写一行SQL语句就可以完成各种建表和增删改查操作。

https://github.com/LitePalFramework/LitePal

  1. 配置LitePal 在app/build.gradle文件中的dependencies闭包中添加

    implementation 'org.litepal.android:java:3.0.0'
    

    然后在app/src/main目录下新建一个assets目录然后在assets目录下新建一个litepal.xml文件 然后编辑如下内容。

    <?xml version="1.0" encoding="utf-8"?>
    <litepal>
        <dbname value="BookStore" />
        <version value="1" />
        <list>
        </list>
    </litepal>
    

    <dbname>标签用于指定数据库名

    <version>标签用于指定数据库版本号

    <list>标签用于指定有所的映射模型。

  2. 然后配置AndroidManifest.xml 在application中加入一行

    android:name="org.litepal.LitePalApplication"
    

    完整如下:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="cn.zbuter.sqlitedemo">
    
        <application
            android:name="org.litepal.LitePalApplication"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

    这里我们将项目的application配置为org.litepal.LitePalApplication这样才能让LitePal的所有功能都可以正常工作,

  3. 使用LitePal创建数据库

    1. 定义一个Book类代码如下

      public class Book {
      private int id;
      private double price;
      private int pages;
      private String name;

      public int getId() {
          return id;
      }
      
      public void setId(int id) {
          this.id = id;
      }
      
      public double getPrice() {
          return price;
      }
      
      public void setPrice(double price) {
          this.price = price;
      }
      
      public int getPages() {
          return pages;
      }
      
      public void setPages(int pages) {
          this.pages = pages;
      }
      
      public String getName() {
          return name;
      }
      
      public void setName(String name) {
          this.name = name;
      }
      

      }

    2. 然后在litepal.xml下创建映射:


      完整如下









      使用mapping标签来声明我们要配置的映射模型类, 一定要使用完整的类名, 不管由多少模型类需要映射都只需要用同样的方式配置在<list>标签下数据库就会自动创建出来,

    3. 修改MainActivity中的代码如下

      public class MainActivity extends AppCompatActivity {

      Button btn_create_table_book;
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          btn_create_table_book = (Button) findViewById(R.id.btn_create_table_book);
      
          btn_create_table_book.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  LitePal.getDatabase(); //这样就创建了数据库并创建好了映射对应的所有表。
              }
          });
      }
      

      }

  4. 使用LitePal升级数据库

    在Litepal中升级数据库只需要在修改完所有要升级东西后在litepal.xml中的version版本号加1就可以了。

    例如:
    在Book表中添加一个press属性并生成get&set方法。
    再创建一个Category类,
    然后只需要在<version value="2">即可 然后在<list> 的mapping设置好映射。

  5. 使用LitePal添加数据

    1. 需要让Book类继承LitePalSupport 然后向只需要调用Book类继承的save()方法即可完成对数据的添加

      public class Book extends LitePalSupport {  ...}
      
    2. 修改MainActivity

      public class MainActivity extends AppCompatActivity {
      
          Button btn_create_table_book;
          Button btn_insert_values;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              btn_create_table_book = (Button) findViewById(R.id.btn_create_table_book);
              btn_insert_values = (Button) findViewById(R.id.btn_insert_values);
      
              btn_create_table_book.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      LitePal.getDatabase(); //这样就创建了数据库并创建好了映射对应的所有表。
                  }
              });
      
              btn_insert_values.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      Book book = new Book();
                      book.setName("熊出没");
                      book.setPages(10000);
                      book.setPress("不知道");
                      book.setPrice(20.8);
                      book.save(); //这样就保存到数据库中了。
                  }
              });
          }
      }
      
  6. 使用LitePal更新数据

    btn_update_values.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Book book = new Book();
            book.setName("第一行代码");
            book.setPrice(79.00);
            book.setPress("人民邮电出版社");
            book.setPages(570);
            book.save();
            book.setPrice(39.0);    //对这个对象的更新。
    
        }
    });
    

    这样就可以更新这本书的价格。 但是这中更新方式只能对已存在的对象进行更新,

    btn_update_values.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Book book = new Book();
            book.setPrice(79.00);
            book.setPress("人民邮电出版社");
            book.updateAll("name = ? and pages>?","熊出没","9999");
    
        }
    });
    

    不过在使用updateAll()方式时 还有一个很重要的点就是当把一个字段的值更新成默认值时 不可以使用上面的方式来set的,如果要设置成默认值需要使用 book.setToDefault("pages"); 然后在updateAll();

  7. 使用LitePal删除数据

    1. 已有对象.delete()即可删除对象
    2. 条件语句删除

      btn_delete_values.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              LitePal.deleteAll(Book.class, "price < ?","124");
          }
      });
      
  8. 使用LitePal查询数据

    btn_select_values.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            List<Book> books = LitePal.findAll(Book.class);//这样就返回了所有数据
            for(Book book: books){
                Log.d("MainActivity", "book name =" + book.getName());
                Log.d("MainActivity", "book press =" + book.getPress());
                Log.d("MainActivity", "book id =" + book.getId());
                Log.d("MainActivity", "book pages =" + book.getPages());
                Log.d("MainActivity", "book price =" + book.getPrice());
            }
    
        }
    });
    

    还可以通过连缀查询来定制更多的查询功能:

    select()方法用于指定查询那几列的数据
    List<Book> books = LitePal.select("name","pages").find(Book.class);
    where()方法用于指定查询的约束条件。
    List<Book> books = LitePal.where("pages > ?","50").find();
    order() 方法用于指定结果的排序方式
    limit() 方法用于指定查询结果的数量。
    offset() 方法用于指定查询结果的偏移量。
    




posted @ 2018-11-26 16:19  Zbuter  阅读(209)  评论(0编辑  收藏  举报