在我的SQLite数据库管理器中,我可以查询:
SELECT SUM(odometer) as odometer FROM tripmileagetable where date like '2012-07%';
此查询返回2012年7月份名为“tripmileagetable”的表中的里程表列的总和,但我想在android查询中编写此代码。
但是我无法弄清楚如何在database.query()方法中建立这个查询,有没有人可以帮忙?
答案 0 :(得分:17)
final Cursor cursor = db.rawQuery("SELECT SUM(odometer) as odometer FROM tripmileagetable where date like '2012-07%';", null);
int sum = 0;
if (cursor != null) {
try {
if (cursor.moveToFirst()) {
sum = cursor.getInt(0);
}
} finally {
cursor.close();
}
}
答案 1 :(得分:2)
这取决于您计划如何在Android中访问数据库。您可以尝试以下方式:
SQLiteDatabase db = this.getWritableDatabase();
String selectQuery = "select sum(odometer) as odometer from tripmileagetable where date like '2012-07%'";
Cursor cursor = db.rawQuery(selectQuery, null);
如果您使用的是SQLiteOpenHelper类,则会使用上述内容。
如果您自己创建了数据库文件,则可以执行以下操作:
SQLiteDatabase db = SQLiteDatabase.openDatabase("/data/data/com.package.name/databases/dbname.db", null, SQLiteDatabase.OPEN_READWRITE);
String selectQuery = "select sum(odometer) as odometer from tripmileagetable where date like '2012-07%'";
Cursor cursor = db.rawQuery(selectQuery, null);
对SQLiteDatase,Cursor和SQLiteOpenHelper进行一些研究。
此示例可能对您有所帮助:
https://github.com/nraboy/Spyfi/blob/master/Android/src/com/nraboy/spyfi/DataSource.java
答案 2 :(得分:0)
您可以使用rawQuery方法:
Cursor c = database.rawQuery("SELECT SUM(odometer) as odometer FROM tripmileagetable where date like '2012-07%'", null);
答案 3 :(得分:0)
您的字段未在表数据库上创建,请查看表格中的字段。因为我已经看到了我的问题。我使用SQLite Administrator来查看我的数据库。
或者如果您没有它,请查看create database的源代码。确保你的源代码是真的,然后你可以删除文件浏览器上的旧数据库(使用eclipse我的意思)。并且您可以使用新数据库再次运行。
答案 4 :(得分:0)
Android完全支持SQLite DBs。您在应用程序中创建的所有数据库都可以从应用程序的所有类中访问(不在您的应用程序之外!)。
首先,您应该创建一个扩展SQLiteOpenHelper的Java类。在这里,您必须覆盖 onCreate()和 onUpdate()方法。可以想象,第一个在创建DB时被调用,而后者在DB被修改时被调用。
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.content.Context;
import android.database.Cursor;
import android.content.ContentValues;
/**
* Class DatabaseHelper.
*/
public class DatabaseHelper extends SQLiteOpenHelper {
//Database parameters:
private static final String DATABASE_NAME = "dbname"; // the name of the DB!
private static final int DATABASE_VERSION = 2;
private static final String DATABASE_TABLE_NAME = "tripmileagetable"; // the name of the table!
//Table attributes:
private static final String DATABASE_TABLE_ATTR_ID = "id"; // attr1
private static final String DATABASE_TABLE_ATTR_ODOMETER = "odometer"; // attr2
private static final String DATABASE_TABLE_ATTR_DATE = "date"; // attr3
/**
* Class constructor.
*
* @param context the context.
*/
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String create = "CREATE TABLE " + DATABASE_TABLE_NAME + " (" +
DATABASE_TABLE_ATTR_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
DATABASE_TABLE_ATTR_ODOMETER + " INTEGER, " +
DATABASE_TABLE_ATTR_DATE + " TEXT);";
db.execSQL( create );
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_NAME);
onCreate(db);
}
}
现在,在新的Java类中,您可以创建自定义方法来查询数据库。
要编写数据库,您应该使用 getWritableDatabase(),而要阅读它,您应该使用 getReadableDatabase()。它们都返回 SQLiteDatabase 对象,最终抛出 SQLiteException 。 特别是,要查询您的数据库,有两个 SQLiteDatabase 方法可用: rawQuery 和查询(两者都返回 Cursor >对象)。
/**
* Get the sum of the odometer of a particular month and year.
*
* @param year the year.
* @param month the month.
* @return the sum of the odometer of the year and the month.
*/
public int sumOdometer(Integer year, Integer month) {
//Date composition:
String date = year.toString() + "-" + month.toString() + "%";
//SQL query:
String query = "SELECT SUM(" + DATABASE_TABLE_ATTR_ODOMETER + ") AS " + DATABASE_TABLE_ATTR_ODOMETER +
" FROM " + DATABASE_TABLE_NAME +
" WHERE " + DATABASE_TABLE_ATTR_DATE + "LIKE ?";
//Execute the SQL query:
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery(query, new String [] {date});
int sum = 0;
if( cursor.moveToFirst() ) { // moves the cursor to the first row in the result set...
sum = cursor.getInt( cursor.getColumnIndex(DATABASE_TABLE_ATTR_ODOMETER) );
}
//Close the Cursor:
cursor.close();
return sum;
}
请注意,SQLite会自动在参数(?)周围放置单引号(')。
您可以在此处找到一个好的教程:http://www.codeproject.com/Articles/119293/Using-SQLite-Database-with-Android