Android:保存数据的三种方法

方法一:使用 SharedPreferences

保存数据

布置页面
在这里插入图片描述
页面代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.black.sq.lesson11.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="注册页面"
        android:textSize="15pt"
        android:id="@+id/textView"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="97dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="用户名:"
        android:textSize="10pt"
        android:id="@+id/textView2"
        android:layout_below="@+id/textView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="37dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="密码:"
        android:textSize="10pt"
        android:id="@+id/textView3"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/un"
        android:layout_alignTop="@+id/textView2"
        android:layout_toRightOf="@+id/textView2"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/pw"
        android:layout_alignTop="@+id/textView3"
        android:layout_toRightOf="@+id/textView3"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="保存"
        android:id="@+id/login"
        android:layout_below="@+id/pw"
        android:layout_alignLeft="@+id/textView"
        android:layout_alignStart="@+id/textView"
        android:layout_marginTop="55dp" />


</RelativeLayout>

让数据保存在手机

代码如下:

public class MainActivity extends AppCompatActivity {
    private Button login;
    private EditText pw;
    private EditText un;
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        login= (Button) findViewById(R.id.login);
        pw= (EditText) findViewById(R.id.pw);
        un= (EditText) findViewById(R.id.un);

        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String pwV=pw.getText().toString().trim();
                String unV=un.getText().toString().trim();

                SharedPreferences sharedPreferences=getSharedPreferences("datal",1);//xml
                SharedPreferences.Editor editor=sharedPreferences.edit();

                editor.putString("un",unV);
                editor.putString("pw",pwV);

                boolean bol=editor.commit();
            }
        });
    }
}

在ADM中看是否保存
在这里插入图片描述
将文件导出进行观看
在这里插入图片描述

读取数据

修改显示
在这里插入图片描述

代码如下:

public class MainActivity extends AppCompatActivity {
    private Button login;
    private Button read;
    private EditText pw;
    private EditText un;
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        login= (Button) findViewById(R.id.login);
        read= (Button) findViewById(R.id.read);
        pw= (EditText) findViewById(R.id.pw);
        un= (EditText) findViewById(R.id.un);

        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String pwV=pw.getText().toString().trim();
                String unV=un.getText().toString().trim();

                SharedPreferences sharedPreferences=getSharedPreferences("datal",1);//xml
                SharedPreferences.Editor editor=sharedPreferences.edit();

                editor.putString("un",unV);
                editor.putString("pw",pwV);
                //修改
                editor.putString("un","asd");
                //删除,根据KEY删除
               editor.remove("pw");
                //默认把所有都清除
                editor.clear();

                boolean bol=editor.commit();
            }
        });
        read.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences sharedPreferences=getSharedPreferences("datal",1);
                String unV=sharedPreferences.getString("un","no");
                String pwV=sharedPreferences.getString("pw","no");
                Log.i("message:",unV+"--"+pwV);
            }
        });
    }

}

方法二:使用IO流

布局如上,省略
Main2Activity代码如下:

public class Main2Activity extends AppCompatActivity {
    private Button save;
    private Button read;
    private EditText pw;
    private EditText un;

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

        save= (Button) findViewById(R.id.save);
        read= (Button) findViewById(R.id.read);
        pw= (EditText) findViewById(R.id.pw);
        un= (EditText) findViewById(R.id.un);

        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String unV=un.getText().toString().trim();
                String pwV=pw.getText().toString().trim();
                try {
                    FileOutputStream fileOutputStream= null;
                    fileOutputStream = openFileOutput("data2",2);//txt
                    String info=unV+"-"+pwV;
                    fileOutputStream.write(info.getBytes());
                    fileOutputStream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        read.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    FileInputStream fileInputStream=openFileInput("data2");
                    byte[] bytes=new byte[1024];
                    int len=fileInputStream.read(bytes);
                   //把字节转换为字符串,利用ByteArrayOutputStream
                    ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
                    byteArrayOutputStream.write(bytes,0,len);
                    String receive=new String(byteArrayOutputStream.toString());

                    fileInputStream.close();

                    Log.i("接受的message:",receive);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

方法三:使用Sqlite数据库

知识点:Sqlite为微型的数据存储方案,内存比较小(比如联系人)
安卓系统自带数据库,存储在内存中(exe)
每一个app都会内置一个Sqlite(属于系统)
要使用Sqlite要创建new自己的库

1.创建一个类,继承 SQLiteOpenHelper

2.onCreate方法(创建表),onUpgrade方法(更改表结构)

当你初始化库的时候就会调用onCreate方法,而且只调用一次
当版本号更改时,会调用onUpgrade方法
Mysqlite代码

public class Mysqlite extends SQLiteOpenHelper {

    public Mysqlite(Context context, String name,  int version) {
        super(context, "lesson11", null, version);
    }
//创建表
    //当你初始化库的时候就会调用该方法
    @Override
    public void onCreate(SQLiteDatabase db) {
        //id主键 不再是int,而是 Integer  自增用autoincrement
        String sql="create table user(id Integer primary key autoincrement,un varchar(30),pw varchar(30))";
        db.execSQL(sql);

    }
    //更改表结构,当版本号更改时,会调用onUpgrade方法
    //修改表结构,当版本号有更改时调用(版本号的值只能从小到大)
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

运行打开ADM,找到文件并导出
在这里插入图片描述
在SQLiteStudio中查看是否创建成功
在这里插入图片描述

3.写Main3Activity 中的逻辑

public class Main3Activity extends AppCompatActivity {
    private Button save;
    private Button read;
    private EditText pw;
    private EditText un;
    private  int version=1;
    private SQLiteDatabase sqLiteDatabase;

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

        save= (Button) findViewById(R.id.save);
        read= (Button) findViewById(R.id.read);
        pw= (EditText) findViewById(R.id.pw);
        un= (EditText) findViewById(R.id.un);
        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String unV=un.getText().toString().trim();
                String pwV=pw.getText().toString().trim();

                Mysqlite mysqlite=new Mysqlite(Main3Activity.this,"lesson11",version);
                sqLiteDatabase= mysqlite.getReadableDatabase();//库才会创建,并且创建表

               // String sql="insert into user(un,pw) values ('"+unV+"','"+pwV+"')";
                sqLiteDatabase.execSQL("insert into user(un,pw) values ('"+unV+"','"+pwV+"')");

            }
        });

        read.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Mysqlite mysqlite=new Mysqlite(Main3Activity.this,"lesson11",version);
                sqLiteDatabase= mysqlite.getReadableDatabase();//库才会创建,并且创建表

                //Cursor相当与Resultset
                Cursor cursor=sqLiteDatabase.rawQuery("select* from user",null);//第二个参数给?赋值
                cursor.moveToNext();//相当于Resultset.next()
                String info=cursor.getString(1);//根据列的索引取值,从0开始
                Log.i("message",info);

                String name=cursor.getColumnName(0);//根据列名取值
                Log.i("message",name);
            }
        });
    }
}

注意:版本号只能越来越大,不能改小
否则报错
在这里插入图片描述

1.添加数据可以使用 sqLiteDatabase.execSQL()方法,也可以使用sqLiteDatabase.insert()

sqLiteDatabase.execSQL()方法

  String sql = "insert into user (un,pw) values('"+unV+"','"+pwV+"')";
        boolean bol = false;
        sqLiteDatabase.execSQL(sql);
        bol = true;

sqLiteDatabase.insert()

   ContentValues contentValues = new ContentValues();
            contentValues.put("un",unV);
            contentValues.put("pw",pwV);
            /*p1:表名
               p2:赋值为null的列名  有:"列的名字" 没有:null 
                 p3:要插入的数据  把数据整理成类似map的结构   
                 返回值:是新添加成功的数据的主键*/
           long i = sqLiteDatabase.insert("user",null,contentValues);
           Log.i("message",i+"");

2.修改 数据sqLiteDatabase.update()

/*p3:修改时的条件  where后边的内容*/
        int i = sqLiteDatabase.update("user",contentValues,"id = ?",new String[]{"2"});
        Log.i("message",i+"");

3.查询数据sqLiteDatabase.query()

注意Cursor 的用法

 /*p3:要查找哪些列  p4:条件  p5:对应条件的值*/
                Cursor cursor= sqLiteDatabase.query(true,"user",new String[]{"un","pw"},null,null,null,null,"id desc",null);

               while(cursor.moveToNext()) {
                  int count =  cursor.getColumnCount();
                   for(int i = 0;i<count;i++){
                       String un = cursor.getString(i);
                       String name = cursor.getColumnName(i);
                       //map.put()
                   }
                    //list.add()
               }
发布了146 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43689040/article/details/103564852