【问题标题】:Cursor query returning 0光标查询返回 0
【发布时间】:2017-04-24 04:23:38
【问题描述】:

我正在使用数据库构建一个应用程序,但是当我从数据库中检索它返回空的值时出现问题(即返回的游标有 0 个元组)并且我确信数据库中包含一些信息。 我正在提供我的代码,如果您发现任何错误,请提供帮助。

用户向数据库输入数据的片段:

    public class FCar extends Fragment implements AdapterView.OnItemSelectedListener {

    public FCar() {
    }

    CarDataBaseAdapter carDataBaseAdapter;
    SessionManagement session;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

//        inflating the view
        final View rootView = inflater.inflate(R.layout.fragment_car, container, false);
//        declaring stuff, not sure why it has to be final
        final Spinner carSpinner;
        final EditText editTextDistance, editTextMin;
        Button btnSubmitCar;

//      create new car database
        carDataBaseAdapter = new CarDataBaseAdapter(getActivity());
        carDataBaseAdapter = carDataBaseAdapter.open();
        SQLiteDatabase x = carDataBaseAdapter.getDatabaseInstance();

        session = new SessionManagement(getActivity().getApplicationContext());

//        display existing tables
/*
        Cursor hi = x.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
        hi.moveToFirst();
        int f = hi.getCount();
        String g = Integer.toString(f);
        Toast.makeText(getActivity().getApplicationContext(), g, Toast.LENGTH_LONG).show();
        while ( !hi.isAfterLast() ) {
            String h = (hi.getString( hi.getColumnIndex("name")) );
            hi.moveToNext();
            Toast.makeText(getActivity().getApplicationContext(), h, Toast.LENGTH_LONG).show();
        }
*/

        // Get References of Views
        carSpinner = (Spinner) rootView.findViewById(R.id.spinner_car_type);
        editTextDistance = (EditText) rootView.findViewById(R.id.editTextcarDistance);
        editTextMin = (EditText) rootView.findViewById(R.id.editTextcarMin);

        // Spinner click listener
        carSpinner.setOnItemSelectedListener(this);

//        set default spinner selection
        carSpinner.setSelection(0);

        // Spinner Drop down elements
        List<String> categories = new ArrayList<>();
        categories.add("Standard");
        categories.add("Truck");
        categories.add("Electric/Hybrid");

        // Creating adapter for spinner
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_item, categories);

        // Drop down layout style - list view with radio button
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        // attaching data adapter to spinner
        carSpinner.setAdapter(dataAdapter);

//      identifying the button
        btnSubmitCar = (Button) rootView.findViewById(R.id.button_car_submit);
        btnSubmitCar.setOnClickListener(new View.OnClickListener() {

                                            public void onClick(View v) {

//              take username entry from login / sign up form via method in FProfile
//                String currentUser = getSingleEntry();
                                                String username = session.getUsername();

                                                SimpleDateFormat formata = new SimpleDateFormat("MM/dd/yyyy", Locale.CANADA);
                                                String date = formata.format(new Date());

                                                String type = carSpinner.getSelectedItem().toString();

//                convert distance to integer
                                                int distance = 0;
                                                try {
                                                    distance = Integer.parseInt(editTextDistance.getText().toString());
                                                } catch (NumberFormatException nfe) {
                                                    System.out.println("Could not parse distance " + nfe);
                                                }
//                convert minutes to integer
                                                int time = 0;
                                                try {
                                                    time = Integer.parseInt(editTextMin.getText().toString());
                                                } catch (NumberFormatException nfe) {
                                                    System.out.println("Could not parse minutes" + nfe);
                                                }

                                                // Save the Data in Database
                                                carDataBaseAdapter.insertEntry(username, date, type, distance, time);
//                                              link back to input menu
                                                Intent intent = new Intent(getActivity(), MainActivity.class);

                                                intent.putExtra("caller", "Input");
                                                startActivity(intent);

                                            }
                                        }
        );
        return rootView;
    }

这是我的查询:

public Cursor getCarEntry(String username, String Day, String Type) {

    Cursor carCursor = db.query(true, "CAR", new String[]{"distance, time"}, "USERNAME=? AND DATE=? AND TYPE=?", new String[]{username, Day, Type}, null, null, null, "50");
    if (carCursor.getCount() < 1) {
        carCursor.close();
    }
        carCursor.moveToFirst();
        for (int i = 0; i < carCursor.getCount(); i++) {
            int distance = carCursor.getInt(carCursor.getColumnIndex("DISTANCE"));
            int time = carCursor.getInt(carCursor.getColumnIndex("TIME"));
        }
        return carCursor;

然后我在片段中检索它

            carStandardCursors[i] = carDataBaseAdapter.getCarEntry(currentUsername, searchDate, "Standard");

然后我做了一个循环来对游标执行数学运算

        for (int i = 0; i < 7; i++) {
        Cursor ccursor = carStandardCursors[i];
        carStandardTotal = CalculateCarStandard(ccursor);
        carStandard[dex] = carStandardTotal;

我发现 carStandardCursors[i] 中的值都是零。

【问题讨论】:

    标签: java android android-database


    【解决方案1】:

    使用 Facebook Stetho Library 检查数据库是否包含 Values。只有你自己才能知道。

    stetho library

    【讨论】:

    • 我用DatabaseManager查看我的数据库,里面有数据。
    • 在查询后立即使用断点运行。然后,您可以获得解释查询的实际值(查询字符串),您可以将其剪切并粘贴到数据库管理器中。
    【解决方案2】:

    问题就在这里,

        public Cursor getCarEntry(String username, String Day, String Type) {
    
    Cursor carCursor = db.query(true, "CAR", **new String[]{"distance, time"}**, "USERNAME=? AND DATE=? AND TYPE=?", new String[]{username, Day, Type}, null, null, null, "50");
    if (carCursor.getCount() < 1) {
        carCursor.close();
    }
        carCursor.moveToFirst();
        for (int i = 0; i < carCursor.getCount(); i++) {
            int distance = carCursor.getInt(carCursor.getColumnIndex("DISTANCE"));
            int time = carCursor.getInt(carCursor.getColumnIndex("TIME"));
        }
        return carCursor;
    

    改成

       public Cursor getCarEntry(String username, String Day, String Type) {
    
    Cursor carCursor = db.query(true, "CAR", new String[]{"DISTANCE", "TIME"}, "USERNAME=? AND DATE=? AND TYPE=?", new String[]{username, Day, Type}, null, null, null, "50");
    if (carCursor.getCount() < 1) {
        return carCursor;
    }else{
         if (carCursor!= null) {
            carCursor.moveToNext();
        }
    
        return carCursor;
    }
    

    然后在你的方法调用处得到这个光标,然后在他们的

       Cursor call = classObject.getCarEntry(username, Day, Type);
    
       int distance = call .getInt(carCursor.getColumnIndex("DISTANCE"));
       int time = call .getInt(carCursor.getColumnIndex("TIME"));
    

    如果有多个数据,则使用 while 循环和 ArrayAdapter

    【讨论】:

    • 嗯,这似乎不是问题,它仍然给我完全相同的东西。不过感谢您的回复!
    猜你喜欢
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多