Android数据库查询无法正常工作

时间:2012-05-19 09:12:17

标签: android database sqlite

我创建了一个包含这样信息的数据库 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,但只要该位置等于任何其他有效数字,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) {

}

3 个答案:

答案 0 :(得分:1)

您确定没有使用应用程序之外的值更新数据库(例如在SQLite管理器中),然后运行应用程序,假设新值将在新运行中出现?您的数据库不会再使用设备/模拟器上的新值进行构建。

尝试重新安装应用程序,然后重新安装(一个疯狂的猜测是,您首先使用一个值启动数据库(对于位置0))。

答案 1 :(得分: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();
}

}

试试这种方式

答案 2 :(得分:0)

我认为数据库查询没有返回任何结果。 c.moveToFirst()必须返回false,因此你不应该做c.getString(...)

更好的处理方式

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