java - 从 sqlite 数据库中检索数据是通过此代码完成的

标签 java android sqlite

我没有得到返回的添加字符串。 Android 应用程序将输入作为食物项并打印其各自的卡路里。 这是创建表的代码:

public class dietclass extends SQLiteOpenHelper {
    public static final String DATABASE_NAME = "diet7.db";
    public static final String TABLE_NAME = "Cal_val";
    public static final String COL1 = "ID";
    public static final String COL2 = "ITEM";
    public static final String COL3 = "QUANTITY";
    public static final String COL4 = "CALORIES";
    public dietclass(Context context) {
        super(context,DATABASE_NAME,null,1);
        SQLiteDatabase db = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
       db.execSQL("create table " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,ITEM TEXT,QUANTITY VARCHAR,CALORIES INTEGER)");

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       db.execSQL("DROP TABLE IF EXISTS " +TABLE_NAME);
        onCreate(db);
    }
}

这里是从我的 Activity 中检索数据的代码,它将项目和卡路里作为输入。

public class foodcal extends AppCompatActivity {
    EditText item;
    EditText quantity;
    TextView calories;
    Button calculate;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_foodcal);
        item = (EditText)findViewById(R.id.etitem);
        quantity = (EditText)findViewById(R.id.etquantity);
        calories = (TextView)findViewById(R.id.calories);
        calculate = (Button)findViewById(R.id.calculate);
        calculate.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                String itemstr = item.getText().toString();
                printDatabase(itemstr);
                //String dbstring = dietclass.databaseToString(itemstr);
                //calories.setText(String.valueOf(dbstring));
            }
    });
    }

    public void printDatabase(String item){
        String dbstring = dietclass.databaseToString(this,item);
        //String label;
        //label = dbstring + "calories";
        calories.setText(String.valueOf(dbstring));
  }

    private static class dietclass extends SQLiteOpenHelper {
        private static String DB_PATH = "/data/data/com.example.janhvik.dietapp/databases/";
        private static String DB_NAME = "diet7.db";
        private static String TABLE_NAME = "Cal_val";
        private static SQLiteDatabase myDataBase;
        private Context myContext;

        public dietclass(Context context) {
            super(context, DB_NAME, null, 1);
            this.myContext = context;
        }
    private static String databaseToString(Context ctx, String item_name) {
            String myDbPath;
            int cal = 0 ;
            String add="";
            myDbPath = DB_PATH+DB_NAME;
            myDataBase = SQLiteDatabase.openOrCreateDatabase(myDbPath, null);
            String query = "SELECT * FROM "+TABLE_NAME+" WHERE ITEM='"+item_name+"'";
            Cursor c = myDataBase.rawQuery(query,null);

            if(c!= null && c.moveToFirst()){
                add = c.getString(c.getColumnIndex("CALORIES"));
                c.close();
            }
            add = add + " calories";
            //Toast.makeText(ctx,add, Toast.LENGTH_LONG).show();
            return add;
            }

我没有收到任何错误,但代码没有从选择查询中获取值,任何人都可以提供帮助。

最佳答案

我认为当您只需要使用数据库助手时,您似乎使用多个数据库助手/方法来打开同一个数据库,这让事情变得相当困惑和复杂。我不确定确切的问题是什么,没有足够的代码来构建一个精确的副本。

而是创建简化的工作代码。

这是基于您的代码的重写/简化:-

第一个数据库助手类即 dietclass :-

public class dietclass extends SQLiteOpenHelper {
    public static final String DATABASE_NAME = "diet7.db";
    public static final String TABLE_NAME = "Cal_val";
    public static final String COL1 = "ID";
    public static final String COL2 = "ITEM";
    public static final String COL3 = "QUANTITY";
    public static final String COL4 = "CALORIES";
    //private static String DB_PATH = "/data/data/com.example.janhvik.dietapp/databases/";
    //private static String DB_NAME = "diet7.db";
    SQLiteDatabase myDataBase;


    private Context myContext;

    public dietclass(Context context) {
        super(context,DATABASE_NAME,null,1);
        myDataBase = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,ITEM TEXT,QUANTITY VARCHAR,CALORIES INTEGER)");

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " +TABLE_NAME);
        onCreate(db);
    }

    public long insertCal_ValEntry(String item, String quantity, int calories) {
        ContentValues cv = new ContentValues();
        cv.put(COL2,item);
        cv.put(COL3,quantity);
        cv.put(COL4,calories);
        return myDataBase.insert(TABLE_NAME,null,cv);
    }


    public String databaseToString(String item_name) {

        //String myDbPath;
        int cal = 0 ;
        String add="";
        //myDbPath = DB_PATH+DB_NAME;
        //myDataBase = SQLiteDatabase.openOrCreateDatabase(myDbPath, null);

        String query = "SELECT * FROM "+TABLE_NAME+" WHERE ITEM='"+item_name+"'";
        Cursor c = myDataBase.rawQuery(query,null);

        if(c.moveToFirst()){
            add = c.getString(c.getColumnIndex("CALORIES"));
            c.close();
        }
        add = add + " calories";
        //Toast.makeText(ctx,add, Toast.LENGTH_LONG).show();
        return add;
    }
}

注意事项

  • 出于测试目的,添加了方法 insertCal_ValEntry
  • 不再尝试打开数据库,而是由助手完成。
  • 检查游标是否为空的检查已被删除,它基本上没有用,因为 SQLite 不会返回空值,它总是返回一个游标,它可能是空的。 Cursor move??? 方法,例如 moveToFirst 如果无法移动则返回 false。
  • databaseToString 方法不需要上下文,因此将其删除。
  • databaseToString 方法成为一个实例方法而不是类方法(即不是静态的)并将其公开。

本例中的 Activity 我使用了 MainActivity
public class MainActivity extends AppCompatActivity {

    EditText item;
    EditText quantity;
    TextView calories;
    Button calculate;

    dietclass dbhelper; //<<<< we want an instance of the database helper
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_foodcal);

        item = (EditText)findViewById(R.id.etitem);
        quantity = (EditText)findViewById(R.id.etquantity);
        calories = (TextView)findViewById(R.id.calories);
        calculate = (Button)findViewById(R.id.calculate);

        dbhelper = new dietclass(this); //<<<< get the instance of the database helper

        dbhelper.insertCal_ValEntry("Porridge", "100g",5000); //<<<< For testing 
        dbhelper.insertCal_ValEntry("Cake","500g", 20000); //<<<< For testing


        calculate.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                String itemstr = item.getText().toString();
                printDatabase(itemstr);

                //String dbstring = dietclass.databaseToString(itemstr);
                //calories.setText(String.valueOf(dbstring));
            }
        });
    }

    public void printDatabase(String item){
        String dbstring =  dbhelper.databaseToString(item); //<<<< 
        //String label;wr
        //label = dbstring + "calories";
        calories.setText(String.valueOf(dbstring));
    }
}

注意事项

  • 上述原则可用于任何 Activity 。那就是获取数据库助手的实例,然后调用助手中的方法来获取/添加/更改数据库中的数据。

以上结果:-

  • 1) 应用程序启动时:-

enter image description here

  • 2) 点击不输入(或输入不在表格中的项目):-

enter image description here

  • 3) 输入有效项目后点击:-

enter image description here

附加信息

如果你真的想获取数据库路径,下面的方法不太容易出错:-

    String databasepath = getDatabasePath(dietclass.DATABASE_NAME).getPath();
    ((TextView) findViewById(R.id.dbpath)).setText(databasepath);

使用 dbpath TextView(注意在 7.0.0 设备上运行):-

enter image description here

在 4.1.1 设备上:-

enter image description here

关于java - 从 sqlite 数据库中检索数据是通过此代码完成的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47845197/

相关文章:

c++ - SQLite3 多进程性能测试

java - Spring 请求将 URL 映射到一个 Controller

java - 从 xml 返回值,xml 迭代

android - 更新生命周期版本后 View 模型工厂类不起作用

android - 如何在 Android 上将我们的应用程序作为系统应用程序运行

android - 哪种布局将使用 10,1"1024x600 平板电脑?

java - 安卓 : SQLite check if data exist and update

java - 如何将字段设置为键并对类进行排序

java - 我可以配置 Wildfly 从一个域名重定向到另一个域名吗?

python - 无法在 TKinter 中显示数据库中的数据