1

個人の財政を監視するためのアプリケーションを作成しています。ユーザーは、アカウント、カテゴリ、およびトランザクションを作成します。このdBHelper.javaクラスは、以下に示すようにデータベースを作成します。

public void onCreate(SQLiteDatabase db) {
    //executes only once
    //create tables
    Log.v("TAG", "creating table:" +racuniTable);
    String sql = "create table " +racuniTable+" (" +colID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " 
    +colName+ " TEXT, " +colValue+ " REAL, " +colAccType+ " TEXT);";

    Log.v("TAG", "creating table:" +transakcijeTable);
    String sql1 = "create table " +transakcijeTable+" (" +colTransID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " 
    +colTransDate+ " DATE, "  +colAmount+ " REAL, " 
    +colIDracuni+ " INTEGER, " +colIDkategorije+ " INTEGER);";

    Log.v("TAG", "creating table:" +kategorijeTable);
    String sql2 = "create table " +kategorijeTable+" (" +colCatID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " +colCatName+ " TEXT);";
    Log.v("TAG", "adding account:");

    db.execSQL(sql);
    db.execSQL(sql1);
    db.execSQL(sql2);
}

この関数は、3 つのデータベースを作成します。すべてのトランザクションのリストまたは SQL 文によって構成されたその他のレポートを取得しようとすると、問題が発生します。

private void getTransactions(){

    try {
        DbHelper dbHelper = new DbHelper(this.getApplicationContext());
        newDB = dbHelper.getWritableDatabase(); 
        m_transaction = new ArrayList<transaction>();
        Cursor c = newDB.rawQuery("SELECT rac.Ime, trans.Znesek, trans.Datum,   kate.Ime FROM Racuni AS rac, " + "Transakcije AS trans, Kategorije 
        as kate WHERE trans.ID_racuna=rac._id AND trans.ID_kategorije=kate._id", null);

        if (c != null ) {
            if  (c.moveToFirst()) {
                do {
                    String racun = c.getString(c.getColumnIndex("rac.Ime"));
                    double znesek = c.getDouble(c.getColumnIndex("trans.Znesek"));
                    String datum = c.getString(c.getColumnIndex("trans.Datum"));
                    String kategorija = c.getString(c.getColumnIndex("kate.Ime"));

                    transaction t1 = new transaction();
                    t1.setracun(racun);
                    t1.setznesek(znesek);
                    t1.setdatum(datum);
                    t1.setkategorija(kategorija);   

                    m_transaction.add(t1);

                }while (c.moveToNext());
            }
        }       
    } catch (SQLiteException se ) {
    Log.e(getClass().getSimpleName(), "Could not create or Open the database");
  }

Cursor以前にアカウントのリストを表示するために a を使用しましたが、完璧に機能しました。なぜそれがもう機能しないのかわかりません。テーブルなどで外部キーを使用していないので、動作するはずです。コードを実行すると、間違った値と多くのエラーが発生します。これらの特定の行でエラーが発生します。

String racun = c.getString(c.getColumnIndex("rac.Ime"));
double znesek = c.getDouble(c.getColumnIndex("trans.Znesek"));
String datum = c.getString(c.getColumnIndex("trans.Datum"));
String kategorija = c.getString(c.getColumnIndex("kate.Ime"));

アプリケーションが実行され、情報が印刷されます。印刷された情報はすべて正しいです。文字列は、そうであってはならない場合racun、文字列と同じです。列kategorijaから間違った値を取得し続ける理由がわかりません。シェルでracunSQLite 3 を使用して SQL をテストしたところ、正常に動作していました。adbLogCat からのエラーは次のとおりです。

08-19 17:48:16.279: ERROR/Cursor(625): requesting column name with table name -- rac.Ime

08-19 17:48:16.331: ERROR/Cursor(625): requesting column name with table name -- trans.Znesek

08-19 17:48:16.359: ERROR/Cursor(625): requesting column name with table name -- trans.Datum

08-19 17:48:16.439: ERROR/Cursor(625): requesting column name with table name -- kate.Ime

SQLでエイリアスを使用したため、何か問題がありますか? これは印刷する必要があります:

SELECT rac.Ime, trans.Znesek, trans.Datum, kate.Ime FROM Racuni AS rac, Transakcije AS trans, Kategorije as kate WHERE trans.ID_racuna=rac._id AND trans.ID_kate
    gorije=kate._id;
    Tomaz|50.0|3911-08-18|placa
    Tom|33.0|3912-07-18|placa
    Tomaz|70.0|3800-07-17|zapravlanje
    Tom|69.0|2010-07-17|placa
    Tomaz|30.0|2011-08-18|placa
    Tom|30.0|2011-08-12|zapravlanje
    Tom|50.0|2011-08-01|placa
    sqlite>

これが私が受け取った残りのものでした。これを解決する方法について何か提案はありますか?

4

2 に答える 2

2

変化する

SELECT rac.Ime, trans.Znesek, trans.Datum, kate.Ime FROM ...

に:

SELECT rac.Ime racun, trans.Znesek, trans.Datum, kate.Ime kategorja FROM ...

そして、それぞれ変更します

c.getColumnIndex(...)
于 2011-08-19T18:39:41.750 に答える
0

例:

Table_1: ID、名前、詳細

Table_2: ID、名前、価格

String ALL_COLUMNS_TABLE_2="Table_2.id _id, Table_2.name _name, Table_2.price _price";

Cursor cursor = db.rawQuery("select "+ Table_1 +".*,"+ALL_COLUMNS_TABLE_2+" from " + Table_1 + "," + Table_2,null);
try {
            if (cursor.moveToFirst()) {
                while (cursor.isAfterLast() == false) {

                    int idTable1 = cursor.getInt(cursor
                            .getColumnIndex("id"));
int idTable2 = cursor.getInt(cursor
                            .getColumnIndex("_id"));
....
}
于 2016-11-07T08:44:12.613 に答える