Java Android SQLite SUM,抛出空指针

Java Android SQLite SUM,抛出空指针,java,android,sqlite,Java,Android,Sqlite,所以我正在开发一个应用程序,我刚刚开始学习android版的SQLite,很明显我因为一个问题被困了3天。 每当我试图运行查询来汇总表中月份等于特定月份的字段时,就会抛出null指针 package com.example.droid; import java.text.SimpleDateFormat; import java.util.Calendar; import com.example.droid.SqDb; import android.accounts.Account; imp

所以我正在开发一个应用程序,我刚刚开始学习android版的SQLite,很明显我因为一个问题被困了3天。 每当我试图运行查询来汇总表中月份等于特定月份的字段时,就会抛出null指针

package com.example.droid;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import com.example.droid.SqDb;

import android.accounts.Account;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.text.format.DateFormat;
import android.util.Log;


public class DbCon {

    private static SQLiteDatabase database;
    private SqDb SqHelper;
    private String[] UserColumns = 
        {
            SqDb.ACCOUNT_ID,
            SqDb.ACCOUNT_NAME,
            SqDb.ACCOUNT_USERNAME,
            SqDb.ACCOUNT_PASSWORD,
            SqDb.ACCOUNT_AGE,
            SqDb.ACCOUNT_CITY,
            SqDb.ACCOUNT_COUNTRY
        };
    private String [] GuestColumns = 
        {
            SqDb.GUEST_ID,
            SqDb.GUEST_NAME
        };
    private String [] TransColumns =
        {
            SqDb.TRAN_ID,
            SqDb.TRAN_DESC,
            SqDb.TRAN_TYPE,
            SqDb.TRAN_TIME,
            SqDb.TRAN_DAY,
            SqDb.TRAN_MON,
            SqDb.TRAN_YEAR,
            SqDb.TRAN_CAT,
            SqDb.TRAN_VAL
        };

    private static DbCon myDCon;

    DbCon(Context context)
    {
        SqHelper = SqDb.getInstance(context);
    }

    public static DbCon getInstance(Context context)
    {
        if(myDCon == null)
            {
            myDCon = new DbCon(context.getApplicationContext());
            }
        return myDCon;
    }

    public void open() throws SQLException
    {
        database = SqHelper.getWritableDatabase();
    }

    public void close()
    {
        SqHelper.close();
    }

    public void createUser(String username, String password, String name, String Age, String City, String Country)
    {
        ContentValues values = new ContentValues();
        values.put(SqDb.ACCOUNT_USERNAME, username);
        values.put(SqDb.ACCOUNT_PASSWORD, password);
        values.put(SqDb.ACCOUNT_NAME, name);
        values.put(SqDb.ACCOUNT_AGE, Age);
        values.put(SqDb.ACCOUNT_CITY, City);
        values.put(SqDb.ACCOUNT_COUNTRY, Country);
        database.insert(SqDb.ACCOUNT, null, values);
    }

    public void createGuest(String name)
    {
        ContentValues values = new ContentValues();
        values.put(SqDb.GUEST_NAME, name);
        database.insert(SqDb.GUEST, null, values);
        }

    public void AddTask(String desc, String type, String cat, double Value)
    {
        ContentValues values = new ContentValues();
        values.put(SqDb.TRAN_DESC, desc);
        values.put(SqDb.TRAN_TYPE, type);
        values.put(SqDb.TRAN_CAT, cat);
        values.put(SqDb.TRAN_VAL, Value);
        SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Calendar cal = Calendar.getInstance();
        String timedata = df.format(cal.getTime());
        String[] whens = timedata.split(" ");
        String time = whens[1];
        String[] dates = whens[0].split("/");
        values.put(SqDb.TRAN_TIME, time);
        values.put(SqDb.TRAN_DAY, dates[2]);
        values.put(SqDb.TRAN_MON, dates[1]);
        values.put(SqDb.TRAN_YEAR, dates[0]);
        database.insert(SqDb.TRAN, null, values);
    }
    Calendar cal = Calendar.getInstance();
    public int getMonthInt(){
        int month = cal.get(Calendar.MONTH);
        return month;
    }
    public double CountMonthExp()
    {
        double din = 0;
        this.open();
        Cursor c = database.rawQuery("SELECT sum("+SqDb.TRAN_VAL+") as"+SqDb.TRAN_VAL+" FROM "+SqDb.TRAN+" WHERE "+SqDb.TRAN_TYPE+"=EXPENDITURE and "+SqDb.TRAN_MON+"=3", null);
        if(c.moveToFirst()){
            din = c.getDouble(0);
        }
        else{
            din = 0;
        }
        return din;
    }


}
有什么建议吗? 是的,这个表创建得很好,工作正常,我测试了插入记录的效果

以下是错误:

03-19 00:18:38.119:E/AndroidRuntime(19822):致命异常:main 03-19 00:18:38.119:E/AndroidRuntime(19822): java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.droid/com.example.droid.Hist_act}: android.database.sqlite.SQLiteException:无此列:支出: ,编译时:选择sum(tran_val)astran_val FROM tran WHERE 交通类型=支出和交通月=3 03-19 00:18:38.119: E/AndroidRuntime(19822):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651) 03-19 00:18:38.119:E/AndroidRuntime(19822):在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 03-19 00:18:38.119:E/AndroidRuntime(19822):在 android.app.ActivityThread.access$1500(ActivityThread.java:117)03-19 00:18:38.119:E/AndroidRuntime(19822):在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 03-19 00:18:38.119:E/AndroidRuntime(19822):在 android.os.Handler.dispatchMessage(Handler.java:99)03-19 00:18:38.119:E/AndroidRuntime(19822):在 android.os.Looper.loop(Looper.java:130)03-19 00:18:38.119: E/AndroidRuntime(19822):在 android.app.ActivityThread.main(ActivityThread.java:3687)03-19 00:18:38.119:E/AndroidRuntime(19822):在 java.lang.reflect.Method.Invokenactive(本机方法)03-19 00:18:38.119:E/AndroidRuntime(19822):在 java.lang.reflect.Method.invoke(Method.java:507)03-19 00:18:38.119: E/AndroidRuntime(19822):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 03-19 00:18:38.119:E/AndroidRuntime(19822):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)03-19 00:18:38.119:E/AndroidRuntime(19822):在 dalvik.system.Nativestar.main(本地方法)03-19 00:18:38.119: E/AndroidRuntime(19822):由以下原因引起: android.database.sqlite.SQLiteException:无此列:支出: ,编译时:选择sum(tran_val)astran_val FROM tran WHERE 交通类型=支出和交通月=3 03-19 00:18:38.119: E/AndroidRuntime(19822):在 android.database.sqlite.SQLiteCompiledSql.native\u compile(native 方法)03-19 00:18:38.119:E/AndroidRuntime(19822):at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92) 03-19 00:18:38.119:E/AndroidRuntime(19822):在 android.database.sqlite.SQLiteCompiledSql.(SQLiteCompiledSql.java:65) 03-19 00:18:38.119:E/AndroidRuntime(19822):在 android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:83) 03-19 00:18:38.119:E/AndroidRuntime(19822):在 android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:49)03-19 00:18:38.119:E/AndroidRuntime(19822):在 android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42) 03-19 00:18:38.119:E/AndroidRuntime(19822):在 android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1356) 03-19 00:18:38.119:E/AndroidRuntime(19822):在 android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1324) 03-19 00:18:38.119:E/AndroidRuntime(19822):在 com.example.droid.DbCon.CountMonthExp(DbCon.java:122)03-19 00:18:38.119:E/AndroidRuntime(19822):在 com.example.droid.Hist_act.onCreate(Hist_act.java:42)03-19 00:18:38.119:E/AndroidRuntime(19822):在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 03-19 00:18:38.119:E/AndroidRuntime(19822):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 03-19 00:18:38.119:E/AndroidRuntime(19822):。。。还有11个


我认为这里至少有两个问题:

SELECT sum(tran_val) astran_val FROM tran WHERE tran_type=EXPENDITURE and tran_mon=3
我怀疑你的意思是:

SELECT sum(tran_val) as tran_val FROM tran WHERE tran_type='EXPENDITURE' and tran_mon=3

我相信您将能够自己更改代码以实现这些调整。

在“)之后应该有一个空格作为“谢谢,这为我指明了答案。哦,我的上帝,谢谢,非常感谢!最后我可以继续我的项目了。