Android 为什么我得到这个上下文和数据库错误?

Android 为什么我得到这个上下文和数据库错误?,android,database,listview,Android,Database,Listview,我正在努力 创建一个简单的listview,该listview可以填充sqldatabase中的数据。数据库可以工作,我见过它与其他代码一起工作。XML很好,我真的不需要共享它。对于XML,主活动中有两个按钮:new和show。New会将您发送到下一个要添加到列表中的活动。Show将向listview添加数据。主要活动到此为止。另一个名为NewEntry的活动有一个取消按钮和一个保存按钮。它还有三个EditView来帮助您添加数据 问题: 现在,它甚至不能无错误地编译。以下主要活动中列出了这两个

我正在努力

创建一个简单的listview,该listview可以填充sqldatabase中的数据。数据库可以工作,我见过它与其他代码一起工作。XML很好,我真的不需要共享它。对于XML,主活动中有两个按钮:new和show。New会将您发送到下一个要添加到列表中的活动。Show将向listview添加数据。主要活动到此为止。另一个名为NewEntry的活动有一个取消按钮和一个保存按钮。它还有三个EditView来帮助您添加数据

问题:

现在,它甚至不能无错误地编译。以下主要活动中列出了这两个错误。如果我注释掉这两个错误,我可以让应用程序运行。当我打开一个新活动并试图保存它时,它崩溃了。它们与上下文有关。我只是有点理解语境的作用,除了它存在于一切事物中这一事实

此错误已解决,请参见底部 这段代码中有两个编译器错误。这是主要的活动。 没有其他编译器错误,只有逻辑错误。 我在评论中已经指出了这些问题 “”数据库管理器无法应用于侦听器“” “无法解析构造函数”

此外,如对上下文有任何解释,将不胜感激

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.view.View.OnClickListener;
import android.widget.ListView;
import android.widget.ArrayAdapter;
import java.util.ArrayList;



public class Main extends Activity {
    private DatabaseManager mydManager;
    private ListView productRec;
    ArrayList<String> tableContent;
    private LinearLayout addLayout;
    ArrayList<String> arrayAdpt;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        productRec=(ListView)findViewById(R.id.list);               
        Button newButton = (Button) findViewById(R.id.new_button);
        Button showButton = (Button) findViewById(R.id.show_button);
        Button newButton = (Button) findViewById(R.id.new_button);

        newButton.setOnClickListener(new OnClickListener() {            
            public void onClick(View n) {
               Intent x = new Intent(Main.this.getApplicationContext(), NewEntry.class);
               startActivity(x);

            }
        });


        showButton.setOnClickListener(new OnClickListener() {            //Want this to launch new intent
            public void onClick(View s) {    
               mydManager = new DatabaseManager(this); // <ERROR: 
               mydManager.openReadable();               //"DATA BASE MANAGER CANNOT BE APPLIED TO LISTENER"     
               tableContent = mydManager.retrieveRows();                
               productRec = (ListView)findViewById(R.id.list);       
               mydManager.retrieveRows();  //ERROR:
               ArrayAdapter<String> arrayAdpt=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tableContent);    //ERROR:CANNOT RESOLVE CONSTRUCTOR
               productRec.setAdapter(arrayAdpt);
               productRec.setVisibility(View.VISIBLE);
               mydManager.close();

            }
        });


    }

}
导入android.database.sqlite.SQLiteDatabase;
导入android.content.Context;
导入android.content.ContentValues;
导入android.database.Cursor;
导入android.database.sqlite.SQLiteOpenHelper;
导入android.util.Log;
导入java.util.ArrayList;
公共类数据库管理器{
公共静态最终字符串DB_NAME=“shopping”;
公共静态最终字符串DB_TABLE=“products”;
公共静态最终int DB_版本=1;
私有静态最终字符串CREATE_TABLE=“CREATE TABLE”+DB_TABLE+(代码整数主键、产品名称文本、日期浮动);
私人助理;
专用数据库数据库;
私人语境;
公共数据库管理器(上下文c){
this.context=c;
helper=newsqlhelper(c);
this.db=helper.getWritableDatabase();
}
public DatabaseManager openReadable()抛出android.database.SQLException{
helper=newsqlhelper(上下文);
db=helper.getReadableDatabase();
归还这个;
}
公众假期结束(){
helper.close();
}
公共布尔addRow(整数t、字符串a、浮点p){
ContentValues newProduct=新ContentValues();
newProduct.put(“title”,t);
newProduct.put(“作者”,a);
新产品卖出价(“价格”,p);
请尝试{db.insertOrThrow(db_TABLE,null,newProduct);}
捕获(例外e){
Log.e(“插入行时出错”,例如toString());
e、 printStackTrace();
返回false;
}
db.close();
返回true;
}
public ArrayList retrieveRows(){///检索编辑
ArrayList productRows=新的ArrayList();
字符串[]列=新字符串[]{“标题”、“作者”、“价格”};
Cursor Cursor=db.query(db_表,列,null,null,null,null);
cursor.moveToFirst();
while(cursor.isAfterLast()==false){
add(Integer.toString(cursor.getInt(0))+”、“+cursor.getString(1)+”、“+Float.toString(cursor.getFloat(2)));
cursor.moveToNext();
}
if(cursor!=null&!cursor.isClosed()){
cursor.close();
}
返回productRows;
}
公共类SQLHelper扩展了SQLiteOpenHelper{
公共SQLHelper(上下文c){
super(c,DB_名称,null,DB_版本);
}
@凌驾
public void onCreate(SQLiteDatabase db){
db.execSQL(创建_表);
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
Log.w(“产品表”,“升级数据库,即删除表并重新创建它”);
db.execSQL(“如果存在删除表”+db_表);
onCreate(db);
}
}
}
尝试检索行时出错:

04-11 22:08:25.552  21767-21767/com.example.alex.checkbox W/dalvikvm? threadid=1: thread exiting with uncaught exception (group=0x41e7cda0)
04-11 22:08:25.572  21767-21767/com.example.alex.checkbox E/AndroidRuntime? FATAL EXCEPTION: main
    Process: com.example.alex.checkbox, PID: 21767
    android.database.sqlite.SQLiteException: no such column: title (code 1): , while compiling: SELECT title, author, price FROM products
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1113)
            at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:690)
            at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
            at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
            at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
            at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
            at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1448)
            at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1295)
            at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1166)
            at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1334)
            at com.example.alex.favoritebooks.DatabaseManager.retrieveRows(DatabaseManager.java:56)
            at com.example.alex.favoritebooks.Main$2.onClick(Main.java:45)
            at android.view.View.performClick(View.java:4654)
            at android.view.View$PerformClick.run(View.java:19438)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5487)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
            at dalvik.system.NativeStart.main(Native Method)
04-11 22:08:25.552 21767-21767/com.example.alex.checkbox W/dalvikvm?threadid=1:线程以未捕获异常退出(组=0x41e7cda0)
04-11 22:08:25.572 21767-21767/com.example.alex.checkbox E/AndroidRuntime?致命异常:主
进程:com.example.alex.checkbox,PID:21767
android.database.sqlite.SQLiteException:没有这样的列:title(代码1):,编译时:选择title、author、price FROM products
位于android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法)
位于android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1113)
位于android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:690)
位于android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
位于android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58)
位于android.database.sqlite.SQLiteQuery(SQLiteQuery.java:37)
位于android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
位于android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1448)
位于android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1295)
位于android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1166)
位于android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1334)
在com.example.alex.favoritebooks.DatabaseManager.retrieveRows(DatabaseManager.java:56)
在com.example.alex.favoritebooks.Main$2.onClick(Main.java:45)上
在android.view.view.performClick上(view.java:4654)
在android.view.view$PerformClick.run(view.java:19438)
位于android.os.Handler.handleCallback(Handler.java:733)
This is the database:
import android.database.sqlite.SQLiteDatabase;
import android.content.Context;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import java.util.ArrayList;

public class DatabaseManager {
    public static final String DB_NAME = "shopping";
    public static final String DB_TABLE = "products";
    public static final int DB_VERSION = 1;
    private static final String CREATE_TABLE = "CREATE TABLE " + DB_TABLE + " (code INTEGER PRIMARY KEY, product_name TEXT, date FLOAT);";
    private SQLHelper helper;
    private SQLiteDatabase db;
    private Context context;

    public DatabaseManager(Context c){
        this.context = c;
        helper=new SQLHelper(c);
        this.db = helper.getWritableDatabase();
    }

    public DatabaseManager openReadable() throws android.database.SQLException {
        helper=new SQLHelper(context);
        db = helper.getReadableDatabase();
        return this;
    }
    public void close(){
        helper.close();
    }
    public boolean addRow(int t, String a, float p){
        ContentValues newProduct = new ContentValues();
        newProduct.put("title", t);
        newProduct.put("author", a);
        newProduct.put("price", p);
        try{db.insertOrThrow(DB_TABLE, null, newProduct);}
        catch(Exception e) {
            Log.e("Error in inserting rows ", e.toString());
            e.printStackTrace();
            return false;
        }
        db.close();
        return true;
    }

    public ArrayList<String> retrieveRows(){    ///Retrieves edit
        ArrayList<String> productRows=new ArrayList<String>();
        String[] columns = new String[]{"title", "author", "price"};
        Cursor cursor = db.query(DB_TABLE, columns, null, null, null, null, null);
        cursor.moveToFirst();
        while (cursor.isAfterLast() == false) {
            productRows.add(Integer.toString(cursor.getInt(0)) + ", "+cursor.getString(1)+", "+Float.toString(cursor.getFloat(2)));
            cursor.moveToNext();
        }
        if (cursor != null && !cursor.isClosed()) {
            cursor.close();
        }
        return productRows;
    }


    public class SQLHelper extends SQLiteOpenHelper {
        public SQLHelper(Context c){
            super(c, DB_NAME, null, DB_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_TABLE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w("Products table","Upgrading database i.e. dropping table and recreating it");
            db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE);
            onCreate(db);
        }
    }
}
04-11 22:08:25.552  21767-21767/com.example.alex.checkbox W/dalvikvm? threadid=1: thread exiting with uncaught exception (group=0x41e7cda0)
04-11 22:08:25.572  21767-21767/com.example.alex.checkbox E/AndroidRuntime? FATAL EXCEPTION: main
    Process: com.example.alex.checkbox, PID: 21767
    android.database.sqlite.SQLiteException: no such column: title (code 1): , while compiling: SELECT title, author, price FROM products
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1113)
            at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:690)
            at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
            at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
            at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
            at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
            at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1448)
            at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1295)
            at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1166)
            at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1334)
            at com.example.alex.favoritebooks.DatabaseManager.retrieveRows(DatabaseManager.java:56)
            at com.example.alex.favoritebooks.Main$2.onClick(Main.java:45)
            at android.view.View.performClick(View.java:4654)
            at android.view.View$PerformClick.run(View.java:19438)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5487)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
            at dalvik.system.NativeStart.main(Native Method)
newButton.setOnClickListener(new OnClickListener() {
    public void onClick(View n) {
        // Simply use Main.this on the next line...
        Intent x = new Intent(Main.this, NewEntry.class);
        startActivity(x);
    }
});
showButton.setOnClickListener(new OnClickListener() {
    public void onClick(View s) {
        mydManager = new DatabaseManager(this); //Here is the error

        ...

        ArrayAdapter<String> arrayAdpt=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tableContent);

        ...
    }
});
showButton.setOnClickListener(new OnClickListener() {
    public void onClick(View s) {
        mydManager = new DatabaseManager(Main.this);

        ...

        arrayAdpt = new ArrayAdapter<String>(Main.this, android.R.layout.simple_list_item_1, tableContent);

        ...
    }
});