0

リストに事前入力されたデータベースからのデータの表示に関する Mimir の Android チュートリアル #10 を使用しています。彼らのデータベースには、(1) 成分の説明、(2) 在庫あり、(3) _id、(4) 成分名の 4 つの列があります。ただし、リストには、individual_name 列のデータのみが表示されます。たとえば、彼らのリストは次のようになります...




等。


しかし、私がやろうとしているのは、4列すべてのデータを連続して表示することです...



説明: 凍った水
ID: 1
在庫あり: はい



説明: H2O
ID: 2
在庫あり: はい


等。


チュートリアルでは bindView と newView を使用しており、彼らのコメントによると、「これによりコードが少しきれいになり、これを行うためのより良い方法です。」

この問題の調査に多くの時間を費やしましたが、データベースからこれら 3 つの追加の列を行に表示する方法を理解できませんでした。以下は、私が行ったいくつかの変更を加えた元のコードです (私の変更は * * * のコメントに記載されています)。

私はまだ何かが欠けていることを知っていますが、それが私が立ち往生しているところです。これら 3 つの追加の列のデータを表示するために何が欠けているか教えてください。可能であれば、チュートリアルを紹介するのではなく、不足しているものや修正方法を具体的に教えてください(すでに非常に多くのことを調べましたが、残念ながら、私の質問に答えることができませんでした)。また、サンプル コードは bindView と newView を使用しているため、それを使用する必要があることにも注意してください。助けてくれてありがとう。

package com.mimirsoft.tutorial10; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Locale; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteQueryBuilder; 
import android.util.Log; 
class IngredientHelper extends SQLiteOpenHelper { 
//we declare a bunch of useful constants 
//the should be pretty obvious what they are! 
private static final String DATABASE_PATH = "/data/data/com.mimirsoft.tutorial10/databases/"; 
private static final String DATABASE_NAME="ingredients.db"; 
private static final int SCHEMA_VERSION=1; 
public static final String TABLE_NAME = "Ingredients"; 
public static final String COLUMN_ID = "_id"; 
public static final String COLUMN_TITLE = "ingredient_name"; 

//* * * MY ADD * * * 
public static final String COLUMN_TITLE2 = "ingredient_description";

//* * * MY ADD * * * 
public static final String COLUMN_TITLE3 = "in_stock";


public SQLiteDatabase dbSqlite; 
private final Context myContext; 
public IngredientHelper(Context context) { 
super(context, DATABASE_NAME, null, SCHEMA_VERSION); 
this.myContext = context; 
// check if exists and copy database from resource 
//createDB(); 
} 
@Override 
public void onCreate(SQLiteDatabase db) { 
// check if exists and copy database from resource 
} 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
} 
public void createDatabase() { 
createDB(); 
} 
private void createDB() { 
boolean dbExist = DBExists(); 
if (!dbExist) { 
//By calling this method we create an empty database into the default system location 
//We need this so we can overwrite that database with our database. 
this.getReadableDatabase(); 
//now we copy the database we included! 
copyDBFromResource(); 
} 
} 
private boolean DBExists() { 
SQLiteDatabase db = null; 
try { 
String databasePath = DATABASE_PATH + DATABASE_NAME; 
db = SQLiteDatabase.openDatabase(databasePath, null, 
SQLiteDatabase.OPEN_READWRITE); 
db.setLocale(Locale.getDefault()); 
db.setLockingEnabled(true); 
db.setVersion(1); 
} catch (SQLiteException e) { 
Log.e("SqlHelper", "database not found"); 
} 
if (db != null) { 
db.close(); 
} 
return db != null ? true : false; 
} 
private void copyDBFromResource() { 
InputStream inputStream = null; 
OutputStream outStream = null; 
String dbFilePath = DATABASE_PATH + DATABASE_NAME; 
try { 
inputStream = myContext.getAssets().open(DATABASE_NAME); 
outStream = new FileOutputStream(dbFilePath); 
byte[] buffer = new byte[1024]; 
int length; 
while ((length = inputStream.read(buffer)) > 0) { 
outStream.write(buffer, 0, length); 
} 
outStream.flush(); 
outStream.close(); 
inputStream.close(); 
} catch (IOException e) { 
throw new Error("Problem copying database from resource file."); 
} 
} 
public void openDataBase() throws SQLException { 
String myPath = DATABASE_PATH + DATABASE_NAME; 
dbSqlite = SQLiteDatabase.openDatabase(myPath, null, 
SQLiteDatabase.OPEN_READWRITE); 
} 
@Override 
public synchronized void close() { 
if (dbSqlite != null) 
{ 
dbSqlite.close(); 
} 
super.close(); 
} 
public Cursor getCursor() { 
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 
queryBuilder.setTables(TABLE_NAME); 

// * * * MY CHANGE - CHANGED FROM... * * * 
//String[] asColumnsToReturn = new String[] { COLUMN_ID, COLUMN_TITLE}; 
//* * * TO... * * * 
//String[] asColumnsToReturn = new String[] { COLUMN_ID, COLUMN_TITLE, COLUMN_TITLE2, COLUMN_TITLE3}; 

//make sure you get your search by string pass correctly! 
Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn, null, 
null, null, null, "ingredient_name ASC"); 
return mCursor; 
} 
public String getName(Cursor c) { 
return(c.getString(1)); 
} 
} 

と...

package com.mimirsoft.tutorial10; 
import android.app.Activity; 
import android.content.Context; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.CursorAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
//This tutorial introduces the CursorAdaptor, explains how it is different 
//from the Array Adapter, and also introduces the database functionality. 
//We will build a ListView from a Database of cocktail Ingredients 
public class Tutorial10 extends Activity { 
private IngredientHelper dbIngredientHelper = null; 
private Cursor ourCursor = null; 
private IngredientAdapter adapter=null; 
public void onCreate(Bundle savedInstanceState) { 
try 
{ 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
//this is our ListView element, obtained by id from our XML layout 
ListView myListView = (ListView)findViewById(R.id.myListView); 
//create our database Helper 
dbIngredientHelper=new IngredientHelper(this); 
//we call the create right after initializing the helper, just in case 
//they have never run the app before 
dbIngredientHelper.createDatabase(); 
// 
//open the database!! Our helper now has a SQLiteDatabase database object 
dbIngredientHelper.openDataBase(); 
//get our cursor. A cursor is a pointer to a dataset, in this case 
//a set of results from a database query 
ourCursor=dbIngredientHelper.getCursor(); 
//tell android to start managing the cursor, 
//we do this just incase our activity is interrupted or ends, we want the activity 
//to close and deactivate the cursor, as needed 
startManagingCursor(ourCursor); 
//create our adapter 
adapter=new IngredientAdapter(ourCursor); 
//set the adapter!!! 
myListView.setAdapter(adapter); 
} 
catch (Exception e) 
{ 
// this is the line of code that sends a real error message to the log 
Log.e("ERROR", "ERROR IN CODE: " + e.toString()); 
// this is the line that prints out the location in 
// the code where the error occurred. 
e.printStackTrace(); 
} 
} 
class IngredientAdapter extends CursorAdapter { 
IngredientAdapter(Cursor c) { 
super(Tutorial10.this, c); 
} 
@Override 
//this is a CusorAdapter 
//instead of Using a getView and if(row==null) 
// we use bindView and newView calls 
//we can get away with this because CursorAdapters have 
//a default implementation of getView that calls bindView and newView 
//as needed. This makes our code a bit cleaner, and is the better way to 
//do this. 
public void bindView(View row, Context ctxt, 
Cursor c) { 
IngredientHolder holder=(IngredientHolder)row.getTag(); 
holder.populateFrom(c, dbIngredientHelper); 
} 
@Override 
public View newView(Context ctxt, Cursor c, 
ViewGroup parent) { 
LayoutInflater inflater=getLayoutInflater(); 
View row=inflater.inflate(R.layout.row, parent, false); 
IngredientHolder holder=new IngredientHolder(row); 
row.setTag(holder); 
return(row); 
} 
} 
static class IngredientHolder { 
private TextView name=null; 
IngredientHolder(View row) { 
name=(TextView)row.findViewById(R.id.ingredientText); 
} 
void populateFrom(Cursor c, IngredientHelper r) { 
name.setText(r.getName(c)); 
} 
} 
}
4

2 に答える 2

0

簡単な方法として、文字列の各行の最後に改行を追加するだけです。それはあなたが望むところで文字列を壊します。そのようにすることのマイナス点は、各行を個別にスタイルできないことです.

より良い方法は、レイアウトを作成し、各文字列をテキスト ビューとして追加することです。Views/Lists/4 の下の Android API Demos に例があります。リストアダプター。それをデバイスに追加するか、エミュレーターで実行します。パッケージ名は com.example.android.apis.view、クラスは List4.java です。

API の例のサブクラスを次に示します。

/**
 * We will use a SpeechView to display each speech. It's just a LinearLayout
 * with two text fields.
 *
 */
private class SpeechView extends LinearLayout {
    public SpeechView(Context context, String title, String words) {
        super(context);

        this.setOrientation(VERTICAL);

        // Here we build the child views in code. They could also have
        // been specified in an XML file.

        mTitle = new TextView(context);
        mTitle.setText(title);
        addView(mTitle, new LinearLayout.LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

        mDialogue = new TextView(context);
        mDialogue.setText(words);
        addView(mDialogue, new LinearLayout.LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
    }
于 2012-08-15T21:24:44.353 に答える
0

これに似たものを試してみます。カーソルを渡し、整数で必要な列を選択し、データを変数に保存します。

プライベートボイド getName(c){

 name.setText(c.getString(0)
 name2.setText(c.getString(1)
 name3.setText(c.getString(2)
 name4.setText(c.getString(3)

}

次に、レイアウトにさらにテキストビューを追加し、データベースからの文字列でテキストを設定します。

于 2012-08-16T02:39:52.357 に答える