1

このような情報を持つデータベースを作成しました http://i170.photobucket.com/albums/u244/therealbbri06/database.jpg

これを使用してデータベースからgroupNameを取得しようとしています

public String readNameFromPosition(int position) {
    Cursor c;
    c = myDataBase.query("hikingGroups", new String[] { "groupName" },
            "position=\'" + position + "\'", null, null, null, null);
    if (c.moveToFirst()) {
        return c.getString(0);
    } else {
        return "" + c.getCount();
    }
}

position = 0の場合、groupNameは適切に取得されますが、positionが他の有効な数値と等しい場合は常に、c.getCount()は「0」を返します。何か助けはありますか?必要に応じて、さらに多くのコードを投稿できます。質問してください。また、readNameFromPosition()は私のDataBaseHelperクラス内にあります。

更新:私のコード

package bry.Bicker.OjaiHiking;
import java.io.IOException;
import android.app.Activity;
import android.database.SQLException;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Gallery;
import android.widget.TextView;
import android.widget.Toast;

public class OjaiHikingActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    final DataBaseHelper theDb = new DataBaseHelper(getApplicationContext());
    try {

        theDb.createDataBase();

    } catch (IOException ioe) {

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

    }

    try {

        theDb.openDataBase();

    } catch (SQLException sqle) {

        throw sqle;

    }
    final Gallery hikesGallery = (Gallery) findViewById(R.id.gallery1);
    hikesGallery.setAdapter(new ImageAdapter(this));
    hikesGallery.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            String groupName = "";
            int position = hikesGallery.getSelectedItemPosition();
            Toast.makeText(getApplicationContext(), "" + position,
                    Toast.LENGTH_SHORT).show();
            groupName = theDb.readNameFromPosition(position);
            TextView tV = (TextView) findViewById(R.id.groupName);
            Typeface font = Typeface.createFromAsset(getAssets(),
                    "arialbd.ttf");
            tV.setTypeface(font);
            tV.setText(groupName);
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
        }

    });
    hikesGallery.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView parent, View v, int position,
                long id) {

        }
    });
}
}

DataBaseHelper.javaのコード

package bry.Bicker.OjaiHiking;
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;

public class DataBaseHelper extends SQLiteOpenHelper {

// The Android's default system path of your application database.
private static String DB_PATH = "/data/data/bry.Bicker.OjaiHiking/databases/";

private static String DB_NAME = "Ojaiker.db";

private SQLiteDatabase myDataBase;

private final Context myContext;

public DataBaseHelper(Context context) {

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

public void createDataBase() throws IOException {

    boolean dbExist = checkDataBase();

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

        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();

}

public String readNameFromPosition(int position) {
    Cursor c;
    c = myDataBase.query("hikingGroups", new String[] { "groupName" },
            "position=\'" + position + "\'", null, null, null, null);
    if (c.moveToFirst()) {
        return c.getString(0);
    } else {
        return "" + c.getCount();
    }
}

@Override
public void onCreate(SQLiteDatabase db) {

}

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

}
4

3 に答える 3

1

アプリケーションの外部(SQLiteマネージャーなど)の値でデータベースを更新していないことを確認してから、新しい実行時に新しい値が存在することを前提としてアプリを実行しますか?データベースはデバイス/エミュレーターに存在するため、新しい値で再構築されることはありません。

アプリを再インストールしてから再インストールしてみてください(最初にデータベースを1つの値(位置)のみで開始したと推測されます0)。

于 2012-05-19T10:31:19.753 に答える
0
public String readNameFromPosition(int position) {
Cursor c;
public static final String KEY_ROWID="id";
public static final String KEY_POSITION="position";
public static final String KEY_GROPUNAME="groupName";
String[] col=new String[]{KEY_ROWID,KEY_POSITION,KEY_GROPUNAME};
Cursor c=ourDatabase.query("hikingGroups", col,KEY_POSITION+"="+position, null, null, null, null);

if (c!=null) {
     c.moveToFirst();

    return c.getString(c.getColumnIndex(KEY_GROPUNAME));
} else {
    return "" + c.getCount();
}

}

この方法を試してください

于 2012-05-19T09:38:33.957 に答える
0

DBクエリは結果を返さないと思います。c.moveToFirst()はfalseを返す必要があるため、c.getString(...)を実行しないでください。

より良い取り扱いは

if (c.moveToFirst()) {
    return c.getString(c.getColumnIndex(KEY_GROPUNAME));
} else {
    return "" + c.getCount();
}
于 2013-08-25T06:47:15.243 に答える