2020-11-10(安卓如何传递数据)

1.从文件读取 保存文件的路径使用api去获取

a.getCacheDir();获取/data/data/包名/Cache这个路径
b.getFilesDir();获取/data/data/包名/files这个路径
c.openFileInput(“文件名”)操作getFiles()目录下的文件,返回一个输入流FileInutStream
d.openFileOutput(“文件名”,mode)操作getFilesDir()目录下的文件,返回一个输出流 FileOutputStream
e.Environment.gettexternalStorageDirectory()获取sd卡路径

2.从sharedprefererced中获取(只能存6种类型:int boolean long float String set)
获取Sharepreferences对象

Sharepreferences sp=getSharedPreferences("info",MODE_PRIVATE)
通过SharedPreferences获取缓存的数据
String username =sp.getSring(“username”,“”)
String	pwd=sp.getSring("pwd",""boolean isSave=sp.getBoolean(“isSave”,false

获取sp的Editor对象,通过Editor保存用户名和密码

Editor edit=sp.edit()
edit.putSting(“username”,username)
edit.putSting(“pwd”,pwd)
edit.putBoolean(“isSave”,true)
只有调用了commit提交之后修改才会生效
edit.commit()

3.从数据库中获取
第一步 写一个类创建SQLiteOpenHelper

public	MyOpenHelper(Context context)
{
    
    			//上下文
//第二个参数,要操作的数据库文件的名字,如果传null会创建一个内存中的数据库
//第三个参数,游标工厂,通过这个游标工厂可以创建一个cursor  ,cursor跟JDBC中的ResultSet作用是一样的
//通过sql查询之后,返回的结果集,这个参数如果传null,就用默认的游标工厂
//第四个参数  数据库的版本号,版本号从1开始
super(context,“itehal.db”,null,1//TODO Auto-generated constructor stub
}
public	MyOpener(Context	context,String  name,CursorFactory factory,int version)
{
    
    			super(context,name,factory,version)
//TODO Auto-generated constructor	stub
}

public	void		onCreat(SQLiteDatabase db)
{
    
    		//当数据库文件第一次被创建时会调用这个方法,在这个方法中适合做表的创建和初始化操作
//sqlite中一般id字段都用_id来表示
//sqlite特点  存的所有数据都是字符串
db.execSQL(“create	table	info(_id	integer	primary	key autoincrement,name	varchar(20),phone	varchar(20))”)
} 
public	void	onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)
{
    
    	//当数据库需要升级的时候会走这个方法,如何判断升级?通过版本号,如果版本号变大了,name就onUpgrade
//在这个方法中需要做的是 修改表的结构  或者直接添加新的表,或者删除表
//db.exeSQL(“alter	table	info	add	age	integer”)
//oldVersion 和newVersion的作痛,判断究竟是从哪个版本升级上来的,根据不同的版本可能会有不同的而处理
switch(oldVersion)
{
    
    	case 1breakcase 2breakdefault}
public	void onDowngrade(SQLiteDatabase	db,int oldversion,int newsion)
{
    
    	//super.onDowngrade(db,oldversion,newsion)
如果不注释super,那么当降级时会产生报错,注释super后,在版本降级后,我们可以进行相应的操作
}
}

第二步 创建SQLiteOpenHelper对象, 获得sqliteDataBase通过

SQLiteDataBase执行相应的方法
public	class	Mainactivity	extends Activity{
    
    
private	MyOpenHelper  openhelper;
private	SQLiteDatabase	database;

protected	void	onCreate(Bundle	saveInstanceState)
{
    
    	super.onCreat(savedInstanceState);
setContentenView(R.layout.activity_main);
database=openHelper.getReadableDatabase();
databese=openHelper.getWriteableDatabase();
}
public	void	insert(View v){
    
    
//insert  into	info(name,phone)values(“小涛”,“116463834838”)
database.execSQL(insert  into	info(name,phone)values(“小涛”,“116463834838”))//这方法没返回值,无法获得执行的状态(但是下面谷歌封装好的api都有返回值,相对来讲,谷歌封装效率差些,sql语句使用也更加的被限制)
database.execSQL(insert  into	info(name,phone)values(“小刘”,“1123433834838”))
}

public	void	updata(View v){
    
    
database.execSQL("update  into	set	phone="1354343135"where name="小贾" "));
}
public	void	delete(View v){
    
    
database.execSQL("delete  from info	where name="小贾" "));
}

public void query(View v){
    
    
Cursor	cursor=database.rawQuery(“select  *  from indo”,null)
while(cursor.moveToNext()){
    
    
String	temp=cursor.getString(cursor.getColumnIndex(“phone”));
//Log.d(“result”,“temp+”);
forint i=0;i<cursor.getColunmnCount();i++{
    
    String result=cursor.getString(i);
Log.d(“result”,“temp+”);
}
}
database.close();
}


public  void insert1(View v){
    
    
ContentValues	values=new ContentValues();
//key就是要插入的列的名字  value就是要插入的具体的值(列的索引是从0开始)
values.put(“name”,“王五”);
values.put(“phone”,“15555555555”);
//insert into info (name,phone )  values(“王五”,“564464654”)
//insert  into info (name )values(null);
//第一个参数  数据要插入的表的名字
//第二个参数  String类型的参值,避免出现insert into info(name ) values(null);这种sql语句
//如果确定不会有问题可以传null或者传一个可以接受null值的列名
//第三个参数,ContentValues内部保存了一个map,通过key-value键值对的形式把要插入的数据封装起来
//values.put(“name”,“王五”)
long result=database.insert(“info”,“name”,values)(如果result 等于-1,则说明执行语句失败);
}
public 	void 	updata1(View v){
    
    
ContentValues values=new ContentValues();
//database.execSQL("update  into	set	phone="1354343135"where name="小贾" "));
//第一个参数表名
//第二个参数  要修改的信息,以键值对的形式保存
/第三个参数	where条件  name=? 注意where不用写,只需要写where后面的内容
//第四个参数  where条件中	?具体的值,用String数组来保存,如果有多个条件,数组中的数据要对应起来
//返回值   就是更改究竟影响到几行数据
int update=database.update(“info”,values,“value=?”,new String[  ]{
    
    "王五"});
Toast.makeText(this,“修改了”+updata+“行数据”,Toast.LENGTH_SHORT).show();
}

public	void  delete1(View v){
    
    
//database.execSQL("delete  from info	where name="小贾" "))
//第一个参数表名
//第二个参数,where条件,name=?,注意where不用写,只需要写where后面的内容
//第三个参数, where条件中	?具体的值,用String数组来保存,如果有多个条件,数组中的数据要对应起来
//返回值, 如果第二个和第三个参数不为空,则返回值为具体删除的记录数,如果没有传第二个和第三个参数,这说明要删除全部的数据,如果删除成功返回
int delete=database.delete(“info”,“value=?”,new String[  ]{
    
    "王五"});
Toast.makeText(this,“删除了”+delete+“条数据”,Toast.LENGTH_SHORT).show();
}	


public	void  query1(View v){
    
    
//database.execSQL("select  name,phone,from info where name="小贾" "))
//第一个参数表名
//第二个参数,要查询的列名,用String数组来表示,如果是select *则传入一个null
//第三个参数,要查询的条件,where 语句,name=?
//第四个参数,条件语句的具体的值,用String数组来表示
//第五个参数,groupBy分组查询语句
//第六个参数,groupBy的时候要使用的条件语句having
//第七个条件,排序
Cursor	cursor	=database.query(“info”,null,null,null,null,null,null)
while(cursor.moveToNext())
{
    
    	String string=cursor.getSting(cursor.getColumnIndex(“name”));
Log.d(“API”,string)
}
cursor.close();
}	
protected void onDestroy(){
    
    
super.onDestroy();
database.close();
}
}

4.通过网络获取(通过网络加载数据的代码基本会写在单独的代码中,避免oncreat方法代码过多)
注:联网操作需要开子线程,不能在主线程做联网的操作(不能在子线程更新UI)

public	void click(View  v){
    
    
//获取url
final	String path=et.url.getText().toString();
new thread(){
    
    
public	void run(){
    
    
try{
    
    	
//把url字符串转换成URL对象
url=new URL(path);
//通过URL对象,创建一个HttpURLConnection
Connection=(HttpURLConnection)url.openConnection();
//设置请求的参数,设置请求方法
connection.setConnection(1000000);
int	response=Connection.getResponseCode();//获得响应码
if(response==200{
    
    
//通过Connection获取一个流
InputStream	inputstream=Connection.getInputstream();
//从流中读取数据
final	String result=Utils.getStringFromStream(inputstream);
//获取到数据通过handler发消息通过handler更新UI
}
else{
    
    
//网络连接有问题
}
}
catch(Exception e){
    
    
e.printStackTrace();
}
finally{
    
    
Connection.disconnect();
}
}}.start();
}


注意:子线程不能修改UI
handler机制写法,通过handler,解决线程间通信的问题
runOnUiTHread(Runnable);如果业务逻辑简单,也可以用这个方法在唉子线程更新UI

public  class  Mainactivity2 extends Activity{
    
    
private static	final	int GET_DATA=1;
private TextView tv_text;
//第一步 ,创建一个handler对象
private  Handler  handler =new Handler(){
    
    
//第三步	通过msg.waht区分消息,获得参数在主线程  设置界面
//3.1通过msg.what区分消息
switch(msg.what){
    
    
case GET_DATA:
//3.2通过msg.obj获取传递的参数
///3.3修改界面
tv.text.setText(result);
break;
}
};
};


protected  void  onCreate(Bundle saveInstanceState)
{
    
    	super.onCreate(saveInstanceState);
setContentView(R.layout.activity_main);
tv_text=(TextView)findViewByld(R.id.tv_text);
//联网获取数据
initData();
}

private	void initData(){
    
    
new	Thread(){
    
    
public	void	run(){
    
    
//联网获取数据…………
String  result=“联网获得的数据”;
//第二步  获取到数据后创建message,通过handle来发送消息
//2.1获取消息对象
Message msg=Message.obtain();
//2.2设置msg.what用来区分不同的消息
msg.what=GET_WHAT;
//2.3如果有参数需要携带,通过msg.obj来传递参数
msg.obj=result;
//2.4获取handler发送消息
handler.sendMessage(msg);
}}.start();

}
}

5.从上个activity中获取
//找到intent获取数据

Intent intent=getIntent();

//通过intent的getXXXExtra方法,获取上个页面传递的数据

String	name=intent.getStringExtra(“name”);
boolean inFemale =intent.getBooleanExtra(“isFemale”,false);

猜你喜欢

转载自blog.csdn.net/CSNN2019/article/details/109607353