2010-06-06 135 views
2

我從SQLite數據庫填充文本和列表視圖。數據正確地從光標填充(我看到填充文本行的列表),但我無法看到行中的實際文本 - 我看到的只是空行。對於我的生活,我無法弄清楚我無法看到文本行中的數據。SQLite和填充列表視圖,android

我的佈局:

<?xml version="1.0" encoding="utf-8"?> 
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@android:id/tabhost" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="5dp"> 
    <TabWidget 
     android:id="@android:id/tabs" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 
    <FrameLayout 
     android:id="@android:id/tabcontent" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:padding="5dp" /> 
</LinearLayout> 
</TabHost> 

列表佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"> 

</LinearLayout> 

排佈局:

<?xml version="1.0" encoding="utf-8"?> 
<TextView android:id="@+id/text1" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"/> 

我的主:

package com.gotquestions.gqapp; 

import java.io.IOException; 

import com.gotquestions.gqapp.DataBaseHelper; 
import android.database.Cursor; 
import android.app.TabActivity; 
import android.content.Intent; 
import android.content.res.Resources; 
import android.database.SQLException; 
import android.net.Uri; 
import android.os.Bundle; 
import android.widget.TabHost; 

public class gqMain extends TabActivity { 
/** Called when the activity is first created. */ 

private DataBaseHelper myDbHelper; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Resources res = getResources(); // Resource object to get Drawables 
    TabHost tabHost = getTabHost(); // The activity TabHost 
    TabHost.TabSpec spec; // Resusable TabSpec for each tab 
    Intent intent; // Reusable Intent for each tab 

    // Create an Intent to launch an Activity for the tab (to be reused) 
    intent = new Intent().setClass(this, TopicsActivity.class); 

    // Initialize a TabSpec for each tab and add it to the TabHost 
    spec = tabHost.newTabSpec("topics").setIndicator("" + 
      "Topics") 
        .setContent(intent); 
    tabHost.addTab(spec); 

    // Do the same for the other tabs 
    intent = new Intent().setClass(this, FavoritesActivity.class); 
    spec = tabHost.newTabSpec("favorites").setIndicator("Favorites") 
        .setContent(intent); 
    tabHost.addTab(spec); 

    // Do the same for the other tabs 
    intent = new Intent().setClass(this, AskActivity.class); 
    spec = tabHost.newTabSpec("ask").setIndicator("Ask") 
        .setContent(intent); 
    tabHost.addTab(spec); 

// Do the same for the other tabs 
    intent = new Intent().setClass(this, BlogActivity.class); 
    spec = tabHost.newTabSpec("blog").setIndicator("Blog") 
        .setContent(intent); 
    tabHost.addTab(spec); 



    tabHost.setCurrentTab(0); 



    DataBaseHelper myDbHelper = new DataBaseHelper(this); 
    myDbHelper = new DataBaseHelper(this); 
//test 
    try { 

     myDbHelper.createDataBase(); 

    } catch (IOException ioe) { 

     throw new Error("Unable to create database"); 

    } 

    try { 

     myDbHelper.openDataBase(); 

    }catch(SQLException sqle){ 

     throw sqle; 

    } 

    //Cursor c = myDbHelper.fetchAllTopics(); 


} 




} 

的TopicsActivity Tab..this內產生的數據我的主題活動就是在列表視圖中的數據顯示了,但我不能看到它。我查看了光標適配器,但沒有看到它。

package com.gotquestions.gqapp; 

import com.gotquestions.gqapp.R.layout; 

import android.R; 
import android.app.ListActivity; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.os.Bundle; 

import android.widget.SimpleCursorAdapter; 

public class TopicsActivity extends ListActivity { 
private DataBaseHelper myDbHelper; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


    // 
    DataBaseHelper myDbHelper = new DataBaseHelper(this); 
    myDbHelper = new DataBaseHelper(this); 
//test 


    try { 

     myDbHelper.openDataBase(); 

    }catch(SQLException sqle){ 

     throw sqle; 

    } 



     setContentView(layout.list_layout); 
     Cursor c = myDbHelper.fetchAllTopics(); 
     startManagingCursor(c); 

     String[] from = new String[] { DataBaseHelper.KEY_TITLE }; 
     int[] to = new int[] { R.id.text1 }; 

     // Now create an array adapter and set it to display using our row 
     SimpleCursorAdapter notes = 
      new SimpleCursorAdapter(this, layout.notes_row, c, from, to); 
     setListAdapter(notes); 

     myDbHelper.close(); 








    } 


} 

我的數據庫幫手:

package com.gotquestions.gqapp; 


import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DataBaseHelper extends SQLiteOpenHelper{ 

//The Android's default system path of your application database. 
private static String DB_PATH = "/data/data/com.gotquestions.gqapp/databases/"; 

private static String DB_NAME = "gotquestions_database.mp3"; 
public static final String KEY_TITLE = "topic_title"; 
public static final String KEY_ARTICLE_TITLE = "article_title"; 
public static final String KEY_ROWID = "_id"; 

private static final String TAG = null; 

private SQLiteDatabase myDataBase; 
// 
private final Context myContext; 

/** 
* Constructor 
* Takes and keeps a reference of the passed context in order to access to the  application assets and resources. 
* @param context 
*/ 
public DataBaseHelper(Context context) { 

    super(context, DB_NAME, null, 1); 
    this.myContext = context; 
} 

/** 
* Creates a empty database on the system and rewrites it with your own database. 
* */ 
public void createDataBase() throws IOException{ 

    boolean dbExist = checkDataBase(); 

    if(dbExist){ 
     //do nothing - database already exist 
    }else{ 

     //By calling this method and empty database will be created into the default system path 
      //of your application so we are gonna be able to overwrite that database with our database. 
     this.getReadableDatabase(); 

     try { 

      copyDataBase(); 

     } catch (IOException e) { 

      throw new Error("Error copying database"); 

     } 
    } 

    } 

/** 
* Check if the database already exist to avoid re-copying the file each time you open the application. 
* @return true if it exists, false if it doesn't 
*/ 
private boolean checkDataBase(){ 

    SQLiteDatabase checkDB = null; 

    try{ 
     String myPath = DB_PATH + DB_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

    }catch(SQLiteException e){ 

     //database does't exist yet. 

    } 

    if(checkDB != null){ 

     checkDB.close(); 

    } 

    return checkDB != null ? true : false; 
} 

/** 
* Copies your database from your local assets-folder to the just created empty database in the 
* system folder, from where it can be accessed and handled. 
* This is done by transfering bytestream. 
* */ 
private void copyDataBase() throws IOException{ 

    //Open your local db as the input stream 
    InputStream myInput = myContext.getAssets().open(DB_NAME); 

    // Path to the just created empty db 
    String outFileName = DB_PATH + DB_NAME; 

    //Open the empty db as the output stream 
    OutputStream myOutput = new FileOutputStream(outFileName); 

    //transfer bytes from the inputfile to the outputfile 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer))>0){ 
     myOutput.write(buffer, 0, length); 
    } 

    //Close the streams 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 

} 

public void openDataBase() throws SQLException{ 

    //Open the database 
    String myPath = DB_PATH + DB_NAME; 
    myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

} 

@Override 
public synchronized void close() { 

     if(myDataBase != null) 
      myDataBase.close(); 

     super.close(); 

} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, 
     int newVersion) 
     { 
      Log.w(TAG, "Upgrading database from version " + oldVersion 
        + " to " 
        + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS titles"); 
      onCreate(db); 
     } 

public Cursor getTitle(long rowId) throws SQLException 
{ 
    Cursor mCursor = 
      myDataBase.query(true, "topics", new String[] { 
        KEY_ROWID, 

        KEY_TITLE 
        }, 
        KEY_ROWID + "=" + rowId, 
        null, 
        null, 
        null, 
        null, 
        null); 
    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 
} 

public Cursor fetchAllTopics() { 

    return myDataBase.query("topics", new String[] {KEY_ROWID, KEY_TITLE}, 
      null, 
      null, 
      null, 
      null, 
      null); 



}; 

public Cursor fetchAllFavorites() { 

    return myDataBase.query("articles", new String[] { 
      KEY_ROWID, 

      KEY_ARTICLE_TITLE}, 
      null, 
      null, 
      null, 
      null, 
      null); 



}; 

}

回答

0

我相信你想你的 「列表佈局」 的LinearLayout要與屬性的ListView控件: 機器人:ID =「@ +安卓:id/list「

<?xml version="1.0" encoding="utf-8"?> 
<ListView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+android:id/list" 
/> 
+0

謝謝,傑森。 ID:列表在那裏 - 我相信由於4空格縮進,stackoverflow編輯器將它留空了 這也許已經修復了它,但我相信我剛剛解決了它。我曾無意中導入了android.R,這一切都搞亂了。我刪除了這兩行,然後更正了佈局語句以包含R.並清除了它。 – 2010-06-06 07:08:14

+0

@RobBushway瞭解使用哪個R以及爲什麼會有所不同:) – JoxTraex 2013-02-28 21:32:32

0

有了ListActivity,id應該是

android:id="@android:id/list" 

沒有'+',不是嗎?

......迴應賈森的迴應。