數據存儲(文件存儲、SharedPreferences、數據庫存儲)

數據存儲

文件存儲、SharedPreferences、數據庫存儲java

  • 文件存儲
    用Java流的方式
public class MainActivity extends AppCompatActivity { 
 
  

    private EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText) findViewById(R.id.edit);

        String inputText = load();

        /*此方法是對字符串的雙重判斷,即不爲空,不爲null*/
        if(!TextUtils.isEmpty(inputText)){
            editText.setText(inputText);
// 將光標移動到字符串最後
            editText.setSelection(inputText.length());
            Toast.makeText(this, "恢復成功", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onDestroy()  {
        super.onDestroy();
        String inputText = editText.getText().toString();
        save(inputText);
    }

    /*文件存儲*/
    public void save(String inputText) {
        FileOutputStream out = null;
        BufferedWriter writer = null;
        try {
            out = openFileOutput("data", Context.MODE_PRIVATE);
            writer = new BufferedWriter(new OutputStreamWriter(out));
            writer.write(inputText);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /*文件恢復*/
    public String load() {
        FileInputStream in = null;
        BufferedReader reader = null;
        StringBuilder content = new StringBuilder();
        try {
            in = openFileInput("data");
            reader = new BufferedReader(new InputStreamReader(in));
            String line = "";
            while ((line = reader.readLine()) != null) {
                content.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return content.toString();
    }

}

佈局設置一個編輯框便可
android studio3.0以上版本已經棄用Android Device Monitor,查看文件能夠在View→Tool Windows→Device File Explorer查看
文件目錄爲/data/data/包名/files/下查看android

  • SharedPreferences
    用鍵值的方式
public class MainActivity extends AppCompatActivity { 
 
  
    private Button saveData;
    private  Button restoreData;
    private TextView showData;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        saveData=(Button)findViewById(R.id.save_data);
        restoreData=(Button)findViewById(R.id.restore_data);
        showData=(TextView)findViewById(R.id.show_data);
        /*存儲數據*/
        saveData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();
                editor.putString("name","Tom");
                editor.putInt("age",28);
                editor.putBoolean("married",false);
                editor.apply();
            }
        });

        /*恢復數據*/
        restoreData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SharedPreferences pref=getSharedPreferences("data",MODE_PRIVATE);
                String name=pref.getString("name","");
                int age=pref.getInt("age",0);
                boolean married=pref.getBoolean("married",false);
                showData.setText("name is "+name+"\n"+"age is "+age+"\n"+"married is "+married);
            }
        });
    }
}

佈局就是是兩個按鈕和一個文本
* 數據庫
使用自帶數據庫SQLITE
佈局六個按鈕git

<Button
        android:id="@+id/create_database"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="建立數據庫"
        />

    <Button
        android:id="@+id/add_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="添加數據"
        />

    <Button
        android:id="@+id/up_date"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="更新數據"
        />

    <Button
        android:id="@+id/delete_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="刪除數據"
        />

    <Button
        android:id="@+id/query_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查詢數據"
        />

新建MyDatabaseHelper類github

public class MyDatabaseHelper extends SQLiteOpenHelper { 
 
  

    public static final String CREATE_BOOK="create table Book ("
            +"id integer primary key autoincrement,"
            +"author text,"
            +"price real,"
            +"pages integer,"
            +"name text)";

    public static final String CREATE_CATEGORY="create table Category ("
            +"id integer primary key autoincrement,"
            +"category_name text,"
            +"category_code integer)";

    private Context mContext;

    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext=context;
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(CREATE_BOOK);

        /*建立新表須要onCreate()方法*/
        sqLiteDatabase.execSQL(CREATE_CATEGORY);
        //onCreate(sqLiteDatabase);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

修改MainActivityweb

public class MainActivity extends AppCompatActivity { 
 
  

    public static final String TAG="MainActivity";

    private Button createDatabase;

    private Button addData;

    private Button updateData;

    private Button deleteData;

    private Button queryData;

    private MyDatabaseHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        createDatabase=(Button)findViewById(R.id.create_database);
        addData=(Button)findViewById(R.id.add_data);
        updateData=(Button)findViewById(R.id.up_date);
        deleteData=(Button)findViewById(R.id.delete_data);
        queryData=(Button)findViewById(R.id.query_data);

        /*添加新表的時候須要更改版本號*/
        dbHelper=new MyDatabaseHelper(this,"BookStore.db",null,2);

        /*建立數據庫*/
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dbHelper.getWritableDatabase();
            }
        });

        /*添加數據*/
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase();
                ContentValues values=new ContentValues();
                //開始填寫第一條數據
                values.put("name","離散數學");
                values.put("author","屈婉玲");
                values.put("pages",300);
                values.put("price",33.33);
                //插入第一條數據
                sqLiteDatabase.insert("Book",null,values);
                values.clear();
                //開始填寫第二條數據
                values.put("name","高數十八講");
                values.put("author","張宇");
                values.put("pages",400);
                values.put("price",44.44);
                sqLiteDatabase.insert("Book",null,values);
            }
        });

        /*更新數據*/
        updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase();
                ContentValues values=new ContentValues();
                values.put("author","耿素雲");
                sqLiteDatabase.update("Book",values,"name=?",new String[]{
  
  
  

 "離散數學"});
            }
        });

        /*刪除數據*/
        deleteData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase();
                sqLiteDatabase.delete("Book","name=?",new String[]{
  
  
  

 "高數十八講"});
            }
        });

        /*查詢數據*/
        queryData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase();
                Cursor cursor=sqLiteDatabase.query("Book",null,null,null,null,null,null);
                if (cursor.moveToFirst()){
                    do {
                        String name=cursor.getString(cursor.getColumnIndex("name"));
                        String author=cursor.getString(cursor.getColumnIndex("author"));
                        int pages=cursor.getInt(cursor.getColumnIndex("pages"));
                        double price=cursor.getDouble(cursor.getColumnIndex("price"));
                        Log.d(TAG, "book name is "+name);
                        Log.d(TAG, "book author is "+author);
                        Log.d(TAG, "book pages is "+pages);
                        Log.d(TAG, "book price is "+price);
                    }while (cursor.moveToNext());
                }
                cursor.close();
            }
        });
    }
}

使用LitePal操做,先去項目主頁查看最新版本
implementation 'org.litepal.android:core:2.0.0'
在main下新建assets目錄(new→Floder→AssetsFloder),而後在裏面新建litepal.xml數據庫

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="BookStore">
    </dbname>
    <version value="1">
    </version>
    <list>
        <mapping class="com.example.litepaltest.Book">
        </mapping>
    </list>
</litepal>

而後再註冊
android:name="org.litepal.LitePalApplication"
1.建立數據庫
添加實體類而後映射,再調用LitePal.getDatabase();就是建表app

public class Book {

    private int id;

    private String author;

    private double price;

    private int pages;

    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public double getPrice() {
        return price;
    }

    public void setPages(int pages) {
        this.pages = pages;
    }

    public int getPages() {
        return pages;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
<list>
    <mapping class="com.example.litepaltest.Book">
    </mapping>
</list>
public class MainActivity extends AppCompatActivity { 
 
  
    private Button createDatabase;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        createDatabase=(Button)findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LitePal.getDatabase();
            }
        });
    }
}

2升級數據庫
在實體類裏添加,或者新建實體類,而後在litepal.xml中更改版本號後映射便可ide

public class Category {

    private int id;

    private  String categoryName;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getCategoryName() {
        return categoryName;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }
}
<version value="2">
</version>
<list>
    <mapping class="com.example.litepaltest.Book">
    </mapping>
        <mapping class="com.example.litepaltest.Category">
    </mapping>
</list>

3.向LitePal添加數據(增)
只是建立數據庫是不須要繼承結構的,而進行CRUD(增刪改查)操做,實體類是須要繼承LitePalSupport的
添加數據只須要調用實體類的set方法和DataSupport的save()方法便可
public class Book extends LitePalSupportsvg

addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book=new Book();
                book.setName("離散數學");
                book.setAuthor("屈婉玲");
                book.setPages(400);
                book.setPrice(40.35);
                book.setPress("清華大學出版社");
                book.save();
            }
        });

4.更新數據佈局

updataData.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Book book = new Book();
               book.setAuthor("耿素雲");
               book.updateAll("author=?","屈婉玲");
    }
});

5.刪除數據
LitePal.deleteAll(Book.class,"price<?","15");
6.查詢數據

List<Book>books=LitePal.findAll(Book.class);
               for(Book book:books){
                   Log.d("MainActivity","book name is "+book.getName());
                   Log.d("MainActivity","book author is "+book.getAuthor());
                   Log.d("MainActivity","book pages is "+book.getPages());
                   Log.d("MainActivity","book price is "+book.getPrice());
                   Log.d("MainActivity","book press is "+book.getPress());