Android开发(八)

本章关于Android 中数据库存储 Shared Preference 存储 和SQLLite

Shared Preference 存储
  1. Android 提供有个快速保存文件方式,适合小文件保存,存储位置在data->data-><包名>->shared_prefes-> mrsoft.xml
  2. 获取SharedPreference 对象
3. getSharedPreferences(name, model)
	mode: MODE_PRIVATE: 本应用读取
	MODE_MULTI_PROCESS: 被跨应用执行
4. getPreferences(mode)
  1. 获取SharedPrefences.Editor 对象中添加数据
  2. 提交数据 commit
package com.example.sql_application;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.mingrisoft.R;

public class MainActivity extends AppCompatActivity {
    private String mr = "mr", mrsoft = "mrsoft";    //定义后台用户名与密码
    private String username, password;               //输入的用户名和密码

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

        final EditText usernameET = findViewById(R.id.username);
        final EditText passwordET = findViewById(R.id.password);
        ImageButton login = (ImageButton) findViewById(R.id.login);               //获取登录按钮

        final SharedPreferences sharedPreferences = getSharedPreferences("mrsoft",MODE_PRIVATE);
        final SharedPreferences.Editor editor = sharedPreferences.edit();
        // 获取账号信息
        final String username = sharedPreferences.getString("username","mr");
        final String password = sharedPreferences.getString("password","mrsoft");
        // 实现自动登录
        if (sharedPreferences.getString("username", username).equals(mr)
                && sharedPreferences.getString("password", password).equals(mrsoft)) {
            Intent intent = new Intent(MainActivity.this, MessageActivity.class);  //通过Intent跳转登录后界面
            startActivity(intent);                                                 //启动跳转界面
        }else{
            // 实现手动登录
            login.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String in_username = usernameET.getText().toString();
                    String in_password = passwordET.getText().toString();
                    if(in_password.equals(password) && in_username.equals(username)){
                        Toast.makeText(MainActivity.this, "用户名、密码正确", Toast.LENGTH_SHORT).show();
                        Intent intent = new Intent(MainActivity.this, MessageActivity.class);
                        startActivity(intent);
                        // 存储账号和密码
                        editor.putString("username", username);           //存储用户名
                        editor.putString("password", password);           //存储密码
                        editor.commit();                                    //提交信息
                        Toast.makeText(MainActivity.this, "已保存用户名密码", Toast.LENGTH_SHORT).show();
                    }else{
                        Toast.makeText(MainActivity.this, "用户名或密码错误", Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }


    }
}

内部存储

通过JAVA IO流存储到磁盘上
Android: openFileInput()
Android: openFileOutput()
内部存储: 指的是存在data -> data 目录下存储文件 默认只能被创建它的应用访问到,当这个易用卸载后内部文件也就被删除掉了
外部存储 是否插入SDK上数据

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    byte[] buffer = null;  //定义保存数据的数组

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

        final EditText etext =  findViewById(R.id.editText);     //获取用于填写记事本信息的编辑框组件
        ImageButton btn_save =  findViewById(R.id.btn_save);        //获取保存按钮
        ImageButton btn_cancel =  findViewById(R.id.btn_cancel);   //获取取消按钮

        // 第一次打开时候保存数据
        btn_save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 保存填写的备忘录信息
                FileOutputStream fos = null;
                String text = etext.getText().toString();

                try {
                    fos = openFileOutput("memo", MODE_PRIVATE);    //获得文件输出流,,并指定文件保存的位置
                    fos.write(text.getBytes());
                    fos.flush();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (fos != null) {                              //输出流不为空时
                        try {
                            fos.close();                             //关闭文件输出流
                            Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });

        // 在第二次打开时候保留上次的数据
        FileInputStream fis = null;

        try {
            fis = openFileInput("memo");             //获得文件输入流
            buffer = new byte[fis.available()];

            fis.read(buffer);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fis != null) {                        //输入流不为空时
                try {
                    fis.close();                      //关闭输入流
                    String data = new String(buffer); // 获得数组中保存的数据
                    etext.setText(data);               //将读取的数据保存到编辑框中
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        btn_cancel.setOnClickListener(new View.OnClickListener() {  //实现单击取消按钮,退出应用
            @Override
            public void onClick(View v) {
                finish(); //退出应用
            }
        });

    }
}

外部存储

手机连接到电脑上 能被手机识别部分就是外部存储

1. Environment.getExternalStorageDirectory() 获取外部目录和文件
package com.mingrisoft;

import android.app.Activity;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainActivity extends Activity {
    byte[] buffer = null;   //定义保存数据的数组
    private File file;      //定义存储路径

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final EditText etext = (EditText) findViewById(R.id.editText);      //获取用于填写记事本信息的编辑框组件
        ImageButton btn_save = (ImageButton) findViewById(R.id.save);        //获取保存按钮
        ImageButton btn_abolish = (ImageButton) findViewById(R.id.abolish);  //获取取消按钮
        file = new File(Environment.getExternalStorageDirectory(), "Text.text");  //设置存储sd卡根目录

        btn_save.setOnClickListener(new View.OnClickListener() {  //实现外部存储填写的文本信息
            @Override
            public void onClick(View v) {
                FileOutputStream fos = null;              //定义文件输出流
                String text = etext.getText().toString();        //获取文本信息
                try {
                    fos = new FileOutputStream(file);     //获得文件输出流,并指定文件保存的位置
                    fos.write(text.getBytes());           //保存文本信息
                    fos.flush();                           //清除缓存
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (fos != null) {
                        try {
                            fos.close();                    //关闭文件输出流
                            Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });

        //实现第二次打开应用时显示上一次所保存的文本信息
        FileInputStream fis = null;                         //定义文件输入流
        try {
            fis = new FileInputStream(file);                 //获得文件输入流
            buffer = new byte[fis.available()];            //保存数据的数组
            fis.read(buffer);                               //从输入流中读取数据
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();                                      //关闭输入流
                    String data = new String(buffer);                // 获得数组中保存的数据
                    etext.setText(data);                              //保存到编辑框中
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        btn_abolish.setOnClickListener(new View.OnClickListener() {  //实现单击取消按钮,退出应用
            @Override
            public void onClick(View v) {
                finish();                                      //退出应用
            }
        });


    }
}

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.mingrisoft"
          xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        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>

SQLLite

package com.mingrisoft;

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    private DBOpenHelper dbOpenHelper;   //定义DBOpenHelper

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //创建DBOpenHelper对象,指定名称、版本号并保存在databases目录下
        dbOpenHelper = new DBOpenHelper(MainActivity.this, "dict.db", null, 1);

        final ListView listView = (ListView) findViewById(R.id.result_listView);  //获取显示结果的ListView
        final EditText etSearch = (EditText) findViewById(R.id.search_et);          //获取查询内容的编辑框
        ImageButton btnSearch = (ImageButton) findViewById(R.id.search_btn);     //获取查询按钮
        Button btn_add = (Button) findViewById(R.id.btn_add);                    //获取跳转添加生词界面的按钮
        btn_add.setOnClickListener(new View.OnClickListener() {   //单击添加生词按钮,实现跳转到添加生词的界面
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, AddActivity.class);  //通过Intent跳转添加生词界面
                startActivity(intent);
            }
        });

        btnSearch.setOnClickListener(new View.OnClickListener() {  //单击查询按钮,实现查询词库中的单词
            @Override
            public void onClick(View v) {

                String key = etSearch.getText().toString();  //获取要查询的单词
                //查询单词
                Cursor cursor=dbOpenHelper.getReadableDatabase().query("dict",null
                        ,"word = ?",new String[]{key},null,null,null);


                ArrayList<Map<String, String>> resultList = new ArrayList<Map<String, String>>();   //创建ArrayList对象,用于保存查询出的结果
                while (cursor.moveToNext()) {  // 遍历Cursor结果集
                    Map<String, String> map = new HashMap<>();  // 将结果集中的数据存入HashMap中
                    // 取出查询记录中第2列、第3列的值
                    map.put("word", cursor.getString(1));
                    map.put("interpret", cursor.getString(2));
                    resultList.add(map);                        //将查询出的数据存入ArrayList中
                }

                if (resultList == null || resultList.size() == 0) {  //如果数据库中没有数据
                    // 显示提示信息,没有相关记录
                    Toast.makeText(MainActivity.this, "很遗憾,没有相关记录!", Toast.LENGTH_LONG).show();
                } else {
                    // 否则将查询的结果显示到ListView列表中
                    SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, resultList,
                            R.layout.result_main,
                            new String[]{"word", "interpret"}, new int[]{
                            R.id.result_word, R.id.result_interpret});
                    listView.setAdapter(simpleAdapter);
                }
            }
        });
    }

    @Override
    protected void onDestroy() {  //实现退出应用时,关闭数据库连接
        super.onDestroy();
        if (dbOpenHelper != null) {   //如果数据库不为空时
            dbOpenHelper.close();     //关闭数据库连接
        }
    }

}

package com.example.myapplication;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper  extends SQLiteOpenHelper {

    final String CREATE_TABLE_SQL =
            "create table dict(_id integer primary " +
                    "key autoincrement , word , detail)";

    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, null, version); //重写构造方法并设置工厂为null
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE_SQL); //创建单词信息表
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {

        System.out.println("---版本更新-----" + oldVersion + "--->" + newVersion);
    }
}

content Provider

两个应用程序 之间的消息交流 最重要 数据模型 和 URI
基于数据模型的简单表格提供简答数据模型

content:// com.mingrisoft/person/001
URI : 统一资源标位符
package com.example.myapplication;

import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

// 从手机的通讯录中获取信息
public class MainActivity extends AppCompatActivity {
    // 希望获取姓名
    private  String columns = ContactsContract.Contacts.DISPLAY_NAME;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv = (TextView) findViewById(R.id.result); //获得布局文件中的TextView组件
        tv.setText(getQueryData()); //为TextView设置数据
    }

    private CharSequence getQueryData(){
        StringBuffer sb = new StringBuffer();
        ContentResolver resolver = getContentResolver();

        // 查询 ContentProvider table 获取到ColumnIndex
        Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, null,null,null,null);
        // 获取姓名的索引值
        int displayNameIndex = cursor.getColumnIndex(columns);
        //迭代全部记录
        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
            String displayName = cursor.getString(displayNameIndex);
            sb.append(displayName + "\n");
        }
        cursor.close(); //关闭Cursor
        return sb.toString(); //返回查询结果
    }
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">
    <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
    <application
        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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值