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 1:
break;
case 2:
break;
default:
}
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+”);
for(int 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);