【问题标题】:Query working in sqlite db browser but not in android查询在 sqlite db 浏览器中工作,但在 android 中不工作
【发布时间】:2016-04-14 18:42:17
【问题描述】:

我的数据库有两个表 - BundlesClaim_records。 Bundles 具有列 bundle_idbundle_date。一个捆绑包可以有多个声明记录。因此,每个claim_record 都拥有一个bundle_id,它与Bundles 表中的一条记录相关联。

为了使用捆绑包填充列表视图,我需要创建一个 sqlite 视图,其中包含 bundle_idbundle_date、索赔数量和每个捆绑包的索​​赔总费用。我在 sqlite db 浏览器中运行了下面的 sqlite 查询,它给了我所需的结果。但是我不断得到

“(”附近的异常:语法错误(代码1):

这是我尝试运行的查询:

CREATE VIEW view_bundle_details ( bid, bdate, num_of_claims, total_charge_claims ) 
  AS SELECT bundles.bundle_id ,bundle_date ,COUNT ( * ) , SUM ( claim_records.charge )

这里的图片是在 sqlitebrowser 中运行的查询以及我想要实现的结果

这里是 Bundles 类,我运行的方法是 getCreateBundleDetailsView();

public class Bundles extends DataClass {
public static final String TABLE_NAME_BUNDLES_RECORDS = "bundles";
public static final String BUNDLE_ID = "bundle_id";
public static final String BUNDLE_DATE = "bundle_date";
public static final String NUM_OF_CLAIMS = "num_of_claims";
public static final String BUNDLE_CHARGE = "total_charge_claims";
public static final String VIEW_NAME_BUNDLE_DETAILS = "view_bundle_details";
public static final String VIEW_BUNDLE_ID = "bid";
public static final String VIEW_BUNDLE_DATE = "bdate";

private int idAfterInsertion = 0;
private String[] columns={BUNDLE_ID,BUNDLE_DATE,BUNDLE_CHARGE };
/**
 * Creates an object of DataClass and calls getWritableDatabase to force database creation if necessary
 *
 * @param context
 */
public Bundles(Context context) {
    super(context);
}

public static String getCreateSQLString() {
    return "create table " + TABLE_NAME_BUNDLES_RECORDS + " ("
            + BUNDLE_ID + " integer primary key, "
            + BUNDLE_DATE + " text default '1900-01-01', "
            + BUNDLE_CHARGE + " real default 0"
            + " )";
}

public static  String getCreateBundleDetailsView(){
    return "CREATE VIEW " + VIEW_NAME_BUNDLE_DETAILS + " ( "
            + VIEW_BUNDLE_ID +", "+ VIEW_BUNDLE_DATE +", "+ NUM_OF_CLAIMS +", "+ BUNDLE_CHARGE+ " ) "
            + "AS SELECT " + TABLE_NAME_BUNDLES_RECORDS + "." +BUNDLE_ID +" ,"+BUNDLE_DATE
            + " ,COUNT ( * ) , SUM ( " + ClaimRecords.TABLE_NAME_CLAIM_RECORDS+"."
            + ClaimRecords.CLAIM_CHARGE +" ) FROM "+TABLE_NAME_BUNDLES_RECORDS+" LEFT "
            + "JOIN "+ClaimRecords.TABLE_NAME_CLAIM_RECORDS+" ON "+TABLE_NAME_BUNDLES_RECORDS+"."
            + BUNDLE_ID + " = "+ClaimRecords.TABLE_NAME_CLAIM_RECORDS+"."+BUNDLE_ID + " GROUP BY "
            + TABLE_NAME_BUNDLES_RECORDS+"."+BUNDLE_ID;
}


public boolean addOrUpdate(String bundleDate) {
    try {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues cv = new ContentValues();


        cv.put(BUNDLE_DATE, bundleDate);
        idAfterInsertion = (int)db.insertWithOnConflict(TABLE_NAME_BUNDLES_RECORDS, null, cv, SQLiteDatabase.CONFLICT_REPLACE);
        if (idAfterInsertion<= 0) {
            return false;
        }
        close();
        return true;
    } catch (Exception ex) {
        close();
        return false;
    }
}
public int getJustAddedId(){
    return idAfterInsertion;

}
public int getBundleID(String bundleDate) {
    try {
        String selection = BUNDLE_DATE + "=" + bundleDate;
        cursor = db.query(TABLE_NAME_BUNDLES_RECORDS, columns, selection, null, null, null, null);
        cursor.moveToFirst();
        Bundle obj = fetch();
        close();
        return obj.getId();
    } catch (Exception ex) {
        Log.d("OPDCases.getOPDCase(int)", "Exception " + ex.getMessage());
        return 0;
    }
}


public Bundle fetch(){
    try
    {

        if(cursor.isBeforeFirst()){
            cursor.moveToFirst();
        }
        int index=cursor.getColumnIndex(BUNDLE_ID);
        int id=cursor.getInt(index);
        index=cursor.getColumnIndex(BUNDLE_DATE);
        String name=cursor.getString(index);
        index=cursor.getColumnIndex(BUNDLE_CHARGE);
        float charge=cursor.getFloat(index);
        cursor.moveToNext();
        return new Bundle(id,name,charge);
    }catch(Exception ex){
        return null;
    }

}

public Bundle fetchForBundleReport(){
    try
    {

        if(cursor.isBeforeFirst()){
            cursor.moveToFirst();
        }
        int index=cursor.getColumnIndex(VIEW_BUNDLE_ID);
        int id=cursor.getInt(index);
        index=cursor.getColumnIndex(VIEW_BUNDLE_DATE);
        String name=cursor.getString(index);
        index=cursor.getColumnIndex(NUM_OF_CLAIMS);
        int numOfClaims=cursor.getInt(index);
        index=cursor.getColumnIndex(BUNDLE_CHARGE);
        float charge=cursor.getFloat(index);
        cursor.moveToNext();
        return new Bundle(id,name,charge,numOfClaims);
    }catch(Exception ex){
        return null;
    }

}


public ArrayList<Bundle> getBundles(){
    ArrayList<Bundle> list=new ArrayList<Bundle>();
    try
    {
        db=getReadableDatabase();
        cursor=db.query(TABLE_NAME_BUNDLES_RECORDS, columns, null, null, null, null, null);
        cursor.moveToFirst();
        Bundle obj=fetch();
        while(obj!=null){
            list.add(obj);
            obj=fetch();
        }
        close();
        return list;
    }catch(Exception ex){
        close();
        return list;
    }
}

public ArrayList<Bundle> getBundleReport(){
    ArrayList<Bundle> list=new ArrayList<Bundle>();
    try
    {
        db=getReadableDatabase();
        String[] columns={VIEW_BUNDLE_ID,VIEW_BUNDLE_DATE,NUM_OF_CLAIMS,BUNDLE_CHARGE};
        cursor=db.query(VIEW_NAME_BUNDLE_DETAILS, columns, null, null, null, null, null);
        cursor.moveToFirst();
        Bundle obj=fetchForBundleReport();
        while(obj!=null){
            list.add(obj);
            obj=fetchForBundleReport();
        }
        close();
        return list;
    }catch(Exception ex){
        close();
        return list;
    }
}

}

这是日志猫

04-14 02:31:27.416 6928-6928/com.ashesi.cs.mhealth.data E/SQLiteLog: (1) 靠近 "(": 语法错误

04-14 02:31:27.416 6928-6928/com.ashesi.cs.mhealth.data E/DataClass.onCreate:“(”附近的异常:语法错误(代码 1):,编译时:CREATE VIEW view_bundle_details (bid, bdate, num_of_claims, total_charge_claims) AS SELECT bundles.bundle_id,bundle_date,COUNT (*), SUM (claim_records.charge) FROM bundles LEFT JOIN claim_records ON bundles.bundle_id = claim_records.bundle_id GROUP BY bundles.bundle_id

04-14 02:31:27.496 6928-6928/com.ashesi.cs.mhealth.data D/libEGL:已加载 /system/lib/egl/libEGL_MRVL.so

04-14 02:31:27.506 6928-6928/com.ashesi.cs.mhealth.data D/libEGL:已加载 /system/lib/egl/libGLESv1_CM_MRVL.so

04-14 02:31:27.546 6928-6928/com.ashesi.cs.mhealth.data D/libEGL:已加载 /system/lib/egl/libGLESv2_MRVL.so

04-14 02:31:27.586 6928-6928/com.ashesi.cs.mhealth.data D/GC: OES20 ===> GC 版本 : GC Ver rls_pxa988_KK44_GC13.20

04-14 02:31:27.606 6928-6928/com.ashesi.cs.mhealth.data D/OpenGLRenderer:启用调试模式 0

04-14 02:38:50.909 6928-6934/com.ashesi.cs.mhealth.data D/dalvikvm:调试器已分离;对象注册表有 1 个条目

04-14 02:39:02.490 6928-6928/com.ashesi.cs.mhealth.data W/IInputConnectionWrapper:非活动 InputConnection 上的 showStatusIcon

【问题讨论】:

  • 你能把你的代码贴在你正在做的地方吗?还有,logcat。
  • @Yashasvi 非常感谢您的帮助

标签: android sqlite android-sqlite


【解决方案1】:

你需要像下面这样执行你的语句

CREATE VIEW view_bundle_details AS SELECT bundles.bundle_id AS bid ,bundle_date AS bdate ,COUNT ( *
 ) AS num_of_claims, SUM ( claim_records.charge ) AS total_charge_claims FROM bundles LEFT JOIN claim_records 
ON bundles.bundle_id = claim_records.bundle_id GROUP BY 
bundles.bundle_id

根据this

如果列名列表跟在视图名之后,则该列表确定视图的列名。如果省略列名列表,则视图中的列名派生自 select-stmt 中的结果集列名。请注意,列名列表语法仅在 SQLite 3.9.0 及更高版本中受支持。

所以我相信这就是它给你一个语法错误的原因。请试试这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 2014-03-27
    • 2021-05-10
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 2023-03-19
    • 2015-09-20
    相关资源
    最近更新 更多