2010-07-26 23 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

相关问题