2010-07-26 24 views
1

使用下面的代碼,ListActivity中沒有任何內容出現,正如我所期望的那樣。
logcat中沒有顯示錯誤。沒有數據出現在ListView中,使用SimpleCursorAdapter

Arrival.java

package one.two; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

import android.app.ListActivity; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 

public class Arrival extends ListActivity 
{ 
    private ListView listView; 


    /** Called when the activity is first created. */ 
    public void onCreate(Bundle savedInstanceState) 
    { 
     ArrayList<String> retList = new ArrayList<String>(); 

     System.out.println("Start onCreate Function\n"); 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     System.out.println("In onCreate Function\n"); 
     System.out.println("In of GetData\n"); 
     DBAdapter db = new DBAdapter(this); 

     System.out.println("DB Open\n"); 
     db.open(); 
     System.out.println("DB Opened\n"); 
     retList = getData(); 
     System.out.println("Out of GetData\n"); 
     // force count no. of records in table 
     // dump to check index 
     int cnt = 2; 

     int i=0; 
     for (i = 0; i<cnt; i++) 
      System.out.println(retList.toString()); 
     System.out.println("Array 2 String\n"); 

     Cursor c = db.getCursor(); 
     String[] from = new String[] {DBAdapter.status}; 
     int[] to = new int[] {R.id.txt1}; 


     SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.listtext, c, from, to); 
     this.setListAdapter(mAdapter); 

     System.out.println("Show List\n"); 
     db.close(); 
    } 

    public static ArrayList<String> getData() 
    { 


     ArrayList<String> items = DBAdapter.getAllTitles(); 
     System.out.println("Return a LIST titles\n"); 
     return items; 
     } 


    } 

DBAdapter.java

package one.two; 

import java.util.List; 

import android.app.ListActivity; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 

import java.util.ArrayList; 

public class DBAdapter 
{ 
    public static String status = "status"; 
    public String id = "id"; 
    public String arrival = "arrival"; 
    public String destination = "destination"; 
    public String ferry = "ferry"; 
    private static String DB_PATH = "/data/data/one.two/databases/"; 
    private static final String DATABASE_NAME = "ferry.db"; 
    private static final String DATABASE_TABLE = "port"; 
    public static Context context; 
    public Cursor c; 

    public static SQLiteDatabase DbLib; 

     //overloaded non-null constructor 
    public DBAdapter(Context context) 
    { 
     DbLib = context.openOrCreateDatabase(DATABASE_NAME, SQLiteDatabase.CREATE_IF_NECESSARY,null); 
     System.out.println("OpenOrCreateDB Done"); 
    } 

    public class DatabaseHelper extends SQLiteOpenHelper 
    { 
     Context context; 
     DatabaseHelper(Context context) 
     { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
      this.context = context; 

     }//end constructor DatabaseHelper 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, 
       int newVersion) 
     { 
     }//end onUpgrade() 

     @Override 
     public void onCreate(SQLiteDatabase db) 
     { 
     }//end onCreate() 
    }// end class DatabaseHelper 

    private static DatabaseHelper DBHelper; 
    //private static SQLiteDatabase DbLib; 

    private static final int DATABASE_VERSION = 1; 


     public static ArrayList<String> getAllTitles() 
     { 

      ArrayList<String> port = new ArrayList<String>(); 
       Cursor c=null; 


       c = DbLib.query("port", 
         new String[] { "status", "id", "arrival", 
           "destination", "ferry" }, null, null, 
         null, null, null); 
       try { 
        if (c!=null) { // start - when there is at least 1 record 
         System.out.println("Cursor is NOT NULL"); 

         int i =0; 
         for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) 

         { 
            // Debug Stm 
          System.out.println("Record No. "+i); 
          System.out.println(c.getString(0)); 
          System.out.println(c.getString(1)); 
          System.out.println(c.getString(2)); 
          System.out.println(c.getString(3)); 
          System.out.println(c.getString(4)); 
          // Assign database cursor.records to arraylist 
          port.add(i,c.getString(0)); 
          port.add(i,c.getString(1)); 
          port.add(i,c.getString(2)); 
          port.add(i,c.getString(3)); 
          port.add(i,c.getString(4)); 
          i = i + 1; 

         } 
        } // end - where there is at least 1 record 


       } finally { 
        if (c!=null) { 
        c.close(); 
       } 

       } 
      return port; 
     }//end getAllTitles() 

     public void open() { 
      //Open the database 
      String myPath = DB_PATH + DATABASE_NAME; 
      DbLib = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

     } 
     public Cursor getCursor(){ 
      return c; 

     } 

     public void close() 
     { 
      DbLib.close(); 

     } 

    }//end class DBAdapter 

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<!-- snip... --> 
<ListView 
    android:layout_width="wrap_content" 
    android:layout_y="132dip" 
    android:layout_x="150dip" 
    android:id="@android:id/list" 
    android:layout_height="wrap_content"> 
</ListView> 

回答

1

在一個快速的猜測,我會說這是因爲你關閉數據庫連接請在您的onCreate方法中,在列表適配器有機會從中讀取任何數據之前。運行查詢後,Cursor本身不包含所有數據。

如果您希望您的Activity處理關閉數據庫連接,您應該在或onDestroy方法中執行此操作。

+0

所以我將不得不把db.close()放到我的Arrival.java的另一個onDestroy方法中? – User358218 2010-07-26 02:30:45

+0

您可以將它從'onCreate()'移動到'onDestroy()',因爲它與'Activity'生命週期相匹配:當Activity被創建時打開數據庫,並在數據庫被銷燬時關閉數據庫(即適配器沒有更需要數據訪問)。 – 2010-07-26 02:32:50

+0

我編輯代碼以 \t公共無效的onDestroy() \t { \t \t將對DBAdapter分貝=新將對DBAdapter(本); \t \t db.close(); \t} 我的列表視圖中還沒有顯示數據。 – User358218 2010-07-26 02:41:00

相關問題