三、データベース入門とlistviewの基本使用


1 Androidでデータベース作成
どのような状況で私たちはデータベースを使ってデータを保存しますか?大量のデータ構造が同じデータを格納する必要がある場合.mysql sqlserver 2000 sqlite埋め込みライト級
Sqlite OpenHelper
データベースを作成するステップ:(1)統合Sqlite OpenHelperを作成するには、構造方法を追加し、2つの方法のoncreateを実現する必要があります.onup grade構造方法のパラメータ紹介:
//context :      , name:            factory:    cursor  ,   null 
//version:       , 1  ,      ,onUpgrade      ,4.0        
super(context, "info.db", null,1);
(2)このヘルプクラスのオブジェクトを作成し、getReadable Database()を呼び出します.データベースを開くために作成してくれます.
(3)Ocreateとonuplogradate方法:oncreate方法はデータベースが初めて作成された時に呼び出されます.特にテーブル構造の初期化に適しています.sql文を実行する必要があります.SQLiteDatabase dbはsql文を実行するために使用できます.
//onUpgrade               ;            

       getWritableDatabase   getReadableDatabase                  SqliteDatabase.

  :
getReadableDatabase:
                 ,        ,                。
getWritableDatabase:
                ,        ,     。
2 Androidの下でデータベースの第1種の方式は添削して調べます.
(1)ヘルプクラスのオブジェクトを作成し、get Readable Databaseメソッドを呼び出して、Sqlite Datebaseオブジェクトを返します.
(2)Sqlite Datebaseオブジェクトを使ってexecSqlを呼び出し、添削を行い、rawQuery方法を呼び出して照会する.
特徴:添削は戻り値がないので、sql文の実行が成功したかどうかは判断できません.sql文は手動で書きます.書き間違えやすいです.
private MySqliteOpenHelper mySqliteOpenHelper;
public InfoDao(Context context){
    //          
    mySqliteOpenHelper = new MySqliteOpenHelper(context);
}
public void add(InfoBean bean){
    //   sql    sqliteDatabase  
    //   getReadableDatabase  ,          
    SQLiteDatabase  db = mySqliteOpenHelper.getReadableDatabase();
    // sql:sql  ,  bindArgs:sql        
    db.execSQL("insert into info(name,phone) values(?,?);", new Object[]{bean.name,bean.phone});
    //        
    db.close();
}

public void del(String name){
    //   sql    sqliteDatabase  
    //   getReadableDatabase  ,          
    SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();
    // sql:sql  ,  bindArgs:sql        
    db.execSQL("delete from info where name=?;", new Object[]{name});
    //        
    db.close();
}

public void update(InfoBean bean){
    //   sql    sqliteDatabase  
    //   getReadableDatabase  ,          
    SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();
    // sql:sql  ,  bindArgs:sql        
    db.execSQL("update info set phone=? where name=?;", new Object[]{bean.phone,bean.name});
    //        
    db.close();
}

public void query(String name){
    //   sql    sqliteDatabase  
    //   getReadableDatabase  ,          
    SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();
    // sql:sql  ,  selectionArgs:         ,    cursor  
    Cursor cursor = db.rawQuery("select _id, name,phone from info where name = ?", new String []{name});
    //   Cursor    
    if(cursor != null && cursor.getCount() >0){//  cursor       

        //        ,        
        while(cursor.moveToNext()){ //   ,          
            //     
            int id = cursor.getInt(0);
            String name_str = cursor.getString(1);
            String phone = cursor.getString(2);
System.out.println("_id:"+id+";name:"+name_str+";phone:"+phone);
        }
        cursor.close();//     
    }
    //       
    db.close();
}
3 Androidの下でもう一つの添削を行います.
(1)ヘルプクラスのオブジェクトを作成し、get Readable Databaseメソッドを呼び出して、Sqlite Datebaseオブジェクトを返します.
(2)Sqlite Datebaseオブジェクトを使ってinsertを呼び出し、udate、delete、query方法で添削を行います.
特徴:添削は戻り値があり、sql文の実行が成功したかどうかを判断できますが、検索が足りなくて、多くの表を作って調べられません.だから会社で一般人は添削して第二の方式を使うことが好きで、調査は第一の方式を使います.
private MySqliteOpenHelper mySqliteOpenHelper;
public InfoDao(Context context){
    //          
    mySqliteOpenHelper = new MySqliteOpenHelper(context);
}

public boolean add(InfoBean bean){

    //   sql    sqliteDatabase  
    //   getReadableDatabase  ,          
    SQLiteDatabase  db = mySqliteOpenHelper.getReadableDatabase();

    ContentValues values = new ContentValues(); //   map     ,     
    values.put("name", bean.name);
    values.put("phone", bean.phone);

    // table:    , nullColumnHack:    ,        , values:       ,    :         Id ,-1      
    long result = db.insert("info", null, values);//      sql  

    //        
    db.close();

    if(result != -1){// -1      
        return true;
    }else{
        return false;
    }
}

public int del(String name){
    //   sql    sqliteDatabase  
    //   getReadableDatabase  ,          
    SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();

    // table :  , whereClause:     , whereArgs:          ;    :       
    int result = db.delete("info", "name = ?", new String[]{name});
    //        
    db.close();

    return result;
}

public int update(InfoBean bean){
    //   sql    sqliteDatabase  
    //   getReadableDatabase  ,          
    SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();
    ContentValues values = new ContentValues(); //   map     ,     
    values.put("phone", bean.phone);
    // table:  , values:    , whereClause:     , whereArgs:          ,   :       
    int result = db.update("info", values, "name = ?", new String[]{bean.name});
    //        
    db.close();
    return result;
}

public void query(String name){ 
    //   sql    sqliteDatabase  
    //   getReadableDatabase  ,          
    SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();

    // table:  , columns:     ,  null       ; selection:    , selectionArgs:         ,
    // groupBy:       , having:     , orderBy:       
    Cursor cursor = db.query("info", new String[]{"_id","name","phone"}, "name = ?", new String[]{name}, null, null, "_id desc");
    //   Cursor    
    if(cursor != null && cursor.getCount() >0){ //   cursor       
        //        ,        
        while(cursor.moveToNext()){ //   ,          
            //     
            int id = cursor.getInt(0);
            String name_str = cursor.getString(1);
            String phone = cursor.getString(2);
                System.out.println("_id:"+id+";name:"+name_str+";phone:"+phone);
        }
        cursor.close(); //      

    }
    //        
    db.close();
}
4データベースのトランザクション
事務:複数のsql文を実行するか、同時に成功するか、失敗するか、失敗するか、失敗するか、失敗するか、失敗するか
銀行振り込み
//          
public void transtation(View v){
    // 1.          
    BankOpenHelper bankOpenHelper = new BankOpenHelper(this);
    // 2.           getReadableDatabase     ,      ,    SqliteDatabase      (sql  )
    SQLiteDatabase db = bankOpenHelper.getReadableDatabase();
    // 3.  ,      200,   200
    db.beginTransaction(); //          
    try {
        db.execSQL("update account set money= money-200 where name=?",new String[]{"  "});
        int i = 100/0; //       
        db.execSQL("update account set money= money+200 where name=?",new String[]{"  "});

        db.setTransactionSuccessful(); //       sql        
    } finally {
        db.endTransaction(); //            ,     ,         sql   
    }
}
5 listview入門
ListViewはコントロールであり、垂直スクロールのリストに項目のコントロールを表示します.これらの項目の内容はListAdapterから来ます.EditText Button TextView ImageView Checkboxの5大レイアウト.
1.    Listview

2.  listview

3.    Adapter     BaseAdapter,  4   ,  getcount,getview    
    getcount:  listview       
    getview:  listview         。
4.  Adapter     ,   listview。
    listview.setAdapter(ListAdapter adapter);
6 listview最適化
adapperでgetviewの方法は一つのconvertViewに伝えられます.convertViewはかつて使ったviewのオブジェクトのことです.重複して使うことができますが、使う前に空かどうかを判断し、直接多重しないで、getview方法の返却対象とします.
TextView view = null;
if(convertView != null){//  converView    ,       
    view = (TextView) convertView;
}else{
    view = new TextView(mContext);//    textView  
}
return view;
7 listview—タイガーマシン
javaweb mvc
m....mode....javabean
v....view....jsp
c....control...servlet

listview mvc
m....mode....Bean
v....view....listview
c....control...adapter
8 listview表示原理(了解)
1.   listview          getcount
2.  listview            getview
3.    item   ,        
4.    listview   ,          ,        。
9複雑なlistview画面表示、ニュース
開発手順:
(1).レイアウトはlistviewを書く
(2)listviewを見つける
(3)ニュースデータをlistセットに入れて、adapperの表示データとして、どのようにして得られたニュースデータをアドホッターに渡しますか?
(4)adapperを作成してBaseAdapterを継承し、4つの方法get countを実現する.いくつかのニュースデータがあれば、いくつかの項目がある.get View:エントリとしての複雑なレイアウトを返します.そして表示されるデータはニュースの情報です.???
public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;
    // 1.  converView  listview,    view  getview            
    if(convertView != null){
        view = convertView;
    }else {
        // context:   , resource:    view   layout id, root: layout root(ViewGroup)     getview    ,   null
        view = View.inflate(context, R.layout.item_news_layout, null); //             view  
    }
    // 2.  view       
    ImageView item_img_icon = (ImageView) view.findViewById(R.id.item_img_icon);
    TextView item_tv_des = (TextView) view.findViewById(R.id.item_tv_des);
    TextView item_tv_title = (TextView) view.findViewById(R.id.item_tv_title);

    // 3.  postion       list        ,Bean  
    NewsBean newsBean = list.get(position);
    // 4.              
    item_img_icon.setImageDrawable(newsBean.icon);//  imageView   
    item_tv_title.setText(newsBean.title);
    item_tv_des.setText(newsBean.des);

    return view;
}
(5)adapperオブジェクトを作成してlistviewに設定する
(6)listviewの項目を設定したクリックイベントをパッケージ化してクリックし、ニュースの詳細を確認します.?????????
//   listview       
lv_news.setOnItemClickListener(this);

// listview             parent:  listviw  view:         view     position:       id:    id

public void onItemClick(AdapterView> parent, View view, int position, long id) {  
    //        bean   url   
    NewsBean bean = (NewsBean) parent.getItemAtPosition(position);

    String url = bean.news_url;

    //      
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setData(Uri.parse(url));
    startActivity(intent);
}
1.   listview ok

2.  listview ok 

3.       list    ,    adapter      。 ok 

4.    Adapter   BaseAdatper,         list    ,      
    a.          ok 
    b.  getCount     ok 
    c.getView  :    ok
        1.  convertview,    ,      ,            view    getview     。
            view = View.inflater(Context context, int resuorceId,ViewGroup root)
        2.  view       ,    list    bean              

        3. list     postion         Bean

        4.    bean            
    d.getItem  : list     postion  bean    
    e.getItemId,    postion

5.       Adapter  ,   listview   ok
6.  listview         ok
    listview.setOnItem....

7.  OnItemClicklistener  ,        bean  ,     url, Intent  ;   ok
10は常にinflateの書き方を取得します.
context:文脈、resource:viewオブジェクトに変換するlayoutのid、root:layoutをrootで包んでcodifyの戻り値として、一般にnullを伝えます.
view = View.inflate(context, R.layout.item_news_layout, null); //             view  
(2)Layout Inflaterによってレイアウトをviewオブジェクトに変換する
view =  LayoutInflater.from(context).inflate(R.layout.item_news_layout, null);
(3)システムサービスをcontextで取得し、Layout Inflaterを得て、Layout Inflaterを通じて一つのレイアウトをviewオブジェクトに変換する.
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(R.layout.item_news_layout, null);
11 arrayadapter(見なくてもいいです.これがあると知っていればいいです.)
//     
ListView lv_array = (ListView) findViewById(R.id.lv_array);
ListView lv_simple = (ListView) findViewById(R.id.lv_simple);

//     arrayAdapter
// context  , resource:  id, textViewResourceId:      textview   id, objects:   texitview     
ArrayAdapter arrayAdapter = new ArrayAdapter(this, R.layout.item_listview_layout, R.id.item_tv_class, classz);
lv_array.setAdapter(arrayAdapter);
12 simpleadapper(見なくてもいいです.これがあると知っていればいいです.)
//     simpleAdapter,  simpleAdapter   
ArrayListString, String>> arrayList = new ArrayListString,String>>();
HashMap<String, String> hashMap = new HashMap<String, String>();
hashMap.put("class", "C++");
arrayList.add(hashMap);

HashMap<String, String> hashMap1 = new HashMap<String, String>();
hashMap1.put("class", "android");
arrayList.add(hashMap1);

HashMap<String, String> hashMap2 = new HashMap<String, String>();
hashMap2.put("class", "javaEE");
arrayList.add(hashMap2);

// context, data:     , resource:item  id, from: map  key, to:      id
SimpleAdapter simpleAdapter = new SimpleAdapter(this, arrayList, R.layout.item_listview_layout, new String[]{"class"}, new int[]{R.id.item_tv_class});

lv_simple.setAdapter(simpleAdapter);
13データベースのlistviewの画面表示(ニュース会です.これでいいです.)