OK. Итак, вот проблема, с которой я столкнулся. Я пытаюсь разработать приложение, которое действует как простое напоминание о задачах. Я успешно создал базу данных с 4 столбцами: Имя, Дата, Приоритет и независимо от того, была ли задача выполнена или нет, первые 3 - текст, последний - целое число. Имя - это первичный ключ.

Имя и дата вводятся через текстовые поля (скоро я добавлю календарь). Приоритет вводится через радиогруппу. Сейчас я не добавлял никаких проверок на предмет того, что имя уже не присутствует в базе данных, поэтому приложение вылетает, когда я ввожу то же имя, что пока нормально.

Вот моя проблема: всякий раз, когда я выбираю переключатель в группе переключателей, чтобы установить приоритет, такой же, как у задачи, которая уже была введена ранее (независимо от того, когда она была введена), строка, которая имеет идентичное значение для задача заменена. Никаких ошибок, ничего. И если на основе выбранного переключателя я изменяю текст, хранящийся в таблице вместе с этой конкретной задачей, происходит то же самое. Я имею в виду следующее: изначально при выборе переключателя с высоким приоритетом я сохранил 2 (в виде текста). Среднее значение было 1, низкое - 0. Таким образом, у меня могло быть только 3 строки в таблице: каждая из которых содержит последнюю «задачу», введенную пользователем, которая имеет 2, 1 и 0 соответственно в последнем столбце. Думая, что причиной проблемы являются числа, я заменил их на «ВЫСОКИЙ», «СРЕДНИЙ», «НИЗКИЙ» соответственно. Но теперь у меня может быть максимум 6 строк: со значением последнего столбца 0,1,2, HIGH, MEDIUM, LOW.

Чтобы уточнить, вот пример выполнения:
Имя: a
Дата: 12.12.2012
PR: ВЫСОКИЙ

В таблице:
12/12/2012 ВЫСОКИЙ

Имя: b
Дата: 12.12.2012
PR: НИЗКИЙ

В таблице: 12.12.2012 ВЫСОКОЕ
b 12.12.2012 НИЗКИЙ

Имя: c
Дата: 10.10.2010
PR: ВЫСОКИЙ

В таблице:
c 10.10.2010 ВЫСОКОЕ
b 12.12.2012 НИЗКИЙ

Таким образом, одно и то же значение даты не вызывает проблемы, только приоритет.

Вот код класса, который обрабатывает часть SQL:

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class SQLManager extends SQLiteOpenHelper {

    private static SQLManager sqlObj = null;
    String currUser = null;

    private SQLManager(Context context) {
        super(context, StoreConst.DBNAME, null, StoreConst.DATABASE_VERSION);

        // TODO Auto-generated constructor stub

    }

    public static SQLManager createObject(Context context) // Singleton pattern
    {

        if (sqlObj == null)
            sqlObj = new SQLManager(context);

        return sqlObj;

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL(StoreConst.CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        // Lite- no upgradation of Tables needed in this project
    }

    public void newTask(String tName, String tDate, String tPr) {
        SQLiteDatabase db = this.getWritableDatabase();
        // Inserting Row
        db.execSQL("INSERT INTO " + StoreConst.TABLENAME + "('"
                + StoreConst.NAME + "', '" + StoreConst.DATE + "', '"
                + StoreConst.PR + "', '" + StoreConst.STATUS + "')  VALUES ('"
                + tName + "', '" + tDate + "', '" + tPr + "', 0);");
        db.close();

    }

    public Cursor getTaskByName(int status) {

        SQLiteDatabase db = this.getReadableDatabase();
        /*
         * Cursor cursor = db.query(StoreConst.TABLENAME, null,
         * StoreConst.STATUS + "= " + status, null, StoreConst.NAME, null,
         * " "+StoreConst.NAME+" ASC");
         */
        Cursor cursor = db.rawQuery("SELECT * FROM " + StoreConst.TABLENAME,
                null);
        // + " WHERE " + StoreConst.STATUS + "= " + status
        // + " ORDER BY "
        // + StoreConst.NAME + " ASC", null);
        return cursor;
    }

    public Cursor getTaskByDate(int status) {

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(StoreConst.TABLENAME, null, StoreConst.STATUS
                + "= " + status, null, StoreConst.DATE, null, "'"
                + StoreConst.DATE + "' DESC");
        return cursor;
    }

    public Cursor getTaskByPr(int status) {

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(StoreConst.TABLENAME, null, StoreConst.STATUS
                + "= " + status, null, StoreConst.PR, null, "'" + StoreConst.PR
                + "' DESC");

        return cursor;
    }

    public void clearDataBase() {
        SQLiteDatabase db = this.getWritableDatabase();
        db.execSQL("DELETE FROM " + StoreConst.TABLENAME);
    }

}

Обратите внимание, что указанные выше функции getTaskByName () / Date () / Pr () используются для доступа к базе данных. Как видно из закомментированного раздела, ive даже пытался сделать следующее: Использование кавычек перед именем столбца Добавление пробелов перед именем столбца с использованием rawQuery с использованием execQuery

Вот класс StoreConst:

public class StoreConst {

    public static final int DATABASE_VERSION = 1;
    public static final String TABLENAME = "Tasklist";
    final static public String DBNAME = "Userdata.db";
    final static public String NAME = "Task_Name";
    final static public String DATE = "Task_Deadline";
    final static public String PR = "Task_Priority";
    final static public String STATUS = "Task_Status";   // 0 = To Do ; 1 = Done
    public static final String CREATE_TABLE = "CREATE TABLE " + TABLENAME
            + " (" + StoreConst.NAME + " TEXT PRIMARY KEY," + StoreConst.DATE
            + " TEXT," + StoreConst.PR + " TEXT," + StoreConst.STATUS + " INTEGER"
            + " );";
    public static final String SortBy = "DataBaseSortingOrder";
    public static final String DoStatus = "Do_Status";

}

Вот код, который я использовал для вставки соответствующей задачи в таблицу:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Toast;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TextView;

public class CreateTask extends Activity implements OnClickListener,
        OnCheckedChangeListener {

    Button button_save;
    RadioGroup rg;
    TextView tv1, tv2, tv3, tv4;
    EditText ed1, ed2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.create_task);
        getObjects();
        rg.setOnCheckedChangeListener(this);
        button_save.setOnClickListener(this);

        // prefs = PreferenceManager
        // .getDefaultSharedPreferences(getApplicationContext());
    }

    private void getObjects() {
        // TODO Auto-generated method stub
        button_save = (Button) findViewById(R.id.bAddTask);
        rg = (RadioGroup) findViewById(R.id.rGPr);
        tv1 = (TextView) findViewById(R.id.tVCreatetsk);
        tv2 = (TextView) findViewById(R.id.tVtskName);
        tv3 = (TextView) findViewById(R.id.tVTskDt);
        tv4 = (TextView) findViewById(R.id.tVtskPriority);
        ed1 = (EditText) findViewById(R.id.eTtskname);
        ed2 = (EditText) findViewById(R.id.eTtskDt);
    }

    @Override
    public void onCheckedChanged(RadioGroup arg0, int arg1) {
        // TODO Auto-generated method stub
        switch (arg1) {
        case R.id.rPRhigh:
            Toast.makeText(this, "HIGH PR", Toast.LENGTH_SHORT).show();
            break;
        case R.id.rPRmed:
            Toast.makeText(this, "MED PR", Toast.LENGTH_SHORT).show();
            break;
        case R.id.rPRlow:
            Toast.makeText(this, "LOW PR", Toast.LENGTH_SHORT).show();
            break;
        }

    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub

        SQLManager manager = SQLManager.createObject(getApplicationContext());

        String rId=null;
        switch (rg.getCheckedRadioButtonId()) {
        case R.id.rPRhigh:
            rId = "High";
            break;
        case R.id.rPRmed:
            rId = "Medium";
            break;
        case R.id.rPRlow:
            rId = "Low";
            break;
        }

        if (rg.getCheckedRadioButtonId() != -1
                && ed1.getText().toString() != ""
                && ed2.getText().toString() != ""
                && ed1.getText().toString() != null
                && ed2.getText().toString() != null) {
            manager.newTask(ed1.getText().toString(), ed2.getText().toString(),
                    rId);

            Toast.makeText(this, "Task Added!!", Toast.LENGTH_SHORT).show();
        }

        else {
            if (ed1.getText().toString() == null
                    || ed1.getText().toString() == null)
                Toast.makeText(this, "Enter Task Name", Toast.LENGTH_SHORT)
                        .show();

        }
        {
            if (ed2.getText().toString() == null
                    || ed2.getText().toString() == null)
                Toast.makeText(this, "Enter Task DeadLine", Toast.LENGTH_SHORT)
                        .show();

        }
        {
            if (rg.getCheckedRadioButtonId() == -1)
                Toast.makeText(this, "Select Task Priority", Toast.LENGTH_SHORT)
                        .show();

        }
    }

}

И соответствующий ему файл xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

     <TextView
        android:id="@+id/tVCreatetsk"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="CREATE TASKS" />

    <TextView
        android:id="@+id/tVtskName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Task Name :" />

    <EditText
        android:id="@+id/eTtskname"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/tVTskDt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Task DeadLine :" />

    <EditText
        android:id="@+id/eTtskDt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="date" />

    <TextView
        android:id="@+id/tVtskPriority"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Task Priority :" />

    <RadioGroup
        android:id="@+id/rGPr"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <RadioButton
            android:id="@+id/rPRhigh"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/red"
            android:text="High Priority" />

        <RadioButton
            android:id="@+id/rPRmed"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/yellow"
            android:text=" Medium Priority" />

        <RadioButton
            android:id="@+id/rPRlow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/green"
            android:text="Low Priority" />
    </RadioGroup>

    <Button
        android:id="@+id/bAddTask"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ADD" />

</LinearLayout>

Вот действие, которое я использовал для отображения:

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class DisplayTaskList extends Activity {

    LinearLayout linearLayout;
    SharedPreferences prefs;
    SQLManager manager;
    TextView t1;
    private ArrayList<HashMap<String, String>> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_task_list);

        manager = SQLManager.createObject(getApplicationContext());

        ListView lview = (ListView) findViewById(R.id.listview);

        Cursor c=null;
        int status = getIntent().getExtras().getInt(StoreConst.DoStatus);
        String s = getIntent().getExtras().getString(StoreConst.SortBy);

        if (s == StoreConst.NAME) {
            c = manager.getTaskByName(status);
        } else if (s == StoreConst.DATE) {
            c = manager.getTaskByDate(status);
        } else {
            c = manager.getTaskByPr(status);
        }




        populateListView(c, status);

        ListViewAdapter adapter = new ListViewAdapter(this, list);
        lview.setAdapter(adapter);
    }

    private void populateListView(Cursor c, int status) {

        boolean exist = false;

        list = new ArrayList<HashMap<String, String>>();
        HashMap<String, String> temp = new HashMap<String, String>();

        if (c != null && c.getCount() > 0) {
            c.moveToFirst();
            while (c.getPosition() < c.getCount()) {
                if (c.getInt(3) == status) {
                    temp.put(StoreConst.NAME, c.getString(0));
                    temp.put(StoreConst.DATE, c.getString(1));
                    temp.put(StoreConst.PR, c.getString(2));
                    exist = true;
                }
                list.add(new HashMap<String, String>(temp));
                c.moveToNext();
                temp.clear();
            }
        }

        if (!exist) {
            if (status == 1)
                temp.put(StoreConst.NAME, "No Tasks done yet");
            else
                temp.put(StoreConst.NAME, "No Tasks to do!");
            list.add(temp);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.view_task_by_name, menu);
        return true;
    }

}

И вот действие, которое вызывает это:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class LeftTasks extends Activity implements OnClickListener {
    TextView tv;
    Button button_vnm;
    Button button_vdt;
    Button button_vpr;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.left_tasks);
        getObjects();

        button_vnm.setOnClickListener(this);
        button_vdt.setOnClickListener(this);
        button_vpr.setOnClickListener(this);

    }

    private void getObjects() {
        // TODO Auto-generated method stub

        button_vnm = (Button) findViewById(R.id.bViewbyNamelft);
        button_vdt = (Button) findViewById(R.id.bViewbydtlft);
        button_vpr = (Button) findViewById(R.id.bViewbyprlft);
        tv = (TextView) findViewById(R.id.tVleftTasks);
    }

    @Override
    public void onClick(View vvv) {

        Intent i8 = new Intent(this, DisplayTaskList.class);
        i8.putExtra(StoreConst.DoStatus, 0);
        if (R.id.bViewbyNamelft == ((Button) vvv).getId()) {
            i8.putExtra(StoreConst.SortBy, StoreConst.NAME);
        } else if (R.id.bViewbydtlft == ((Button) vvv).getId()) {
            i8.putExtra(StoreConst.SortBy, StoreConst.DATE);
        } else if (R.id.bViewbyprlft == ((Button) vvv).getId()) {
            i8.putExtra(StoreConst.SortBy, StoreConst.PR);

        }

        startActivity(i8);

    }

}

Спасибо миллиард

1
aspiring_sarge 3 Янв 2014 в 11:49

2 ответа

Лучший ответ

OK. Вот и разобрался. Я напечатаю его здесь для тех, кто случайно попадет на эту страницу и, возможно, совершил аналогичную ошибку (хотя и маловероятно):

Моя ошибка была двукратной:

Во-первых, я сохранял приоритет, отображаемый в таблице только один раз (независимо от того, сколько строк на самом деле имело этот приоритет), потому что я написал db.query как:

db.query(StoreConst.TABLENAME, null, StoreConst.STATUS
                + "= " + status, null, StoreConst.PR, null, "'" + StoreConst.PR
                + "' DESC");  

Где 5-й аргумент - это ГРУППА BY, для которого задано значение StoreConst.PR.

Во-вторых, я совершил очень распространенную ошибку в программировании: использовал == для сравнения строк в моем действии DisplayTaskList. Таким образом, оба if были ложными, и он перешел к третьему else, которое должно было вызвать функцию getTaskByPr () в диспетчере.

0
aspiring_sarge 7 Янв 2014 в 19:54

Ваша проблема в этой строке SQLManager manager = SQLManager.createObject(getApplicationContext());

Вы создаете новый экземпляр для каждой новой задачи.

Создайте его только один раз, чтобы открыть базу данных, и попробуйте вызвать метод newTask () статически, как это

SQLManager.newTask(ed1.getText().toString(), ed2.getText().toString(),
                rId);
0
Ketan Ahir 3 Янв 2014 в 08:24