Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
写入Android应用程序数据库中的第二个表_Android_Database_Sqlite - Fatal编程技术网

写入Android应用程序数据库中的第二个表

写入Android应用程序数据库中的第二个表,android,database,sqlite,Android,Database,Sqlite,我正在(并且已经有一段时间)从事一个android项目,该项目将作为一个非常基本的课程安排应用程序。到目前为止,我做了以下工作:将课程添加到数据库,从数据库中删除课程,在列表中显示位置和主题的课程,打开“作业”菜单为课程创建作业 问题是,当我尝试单击“工作分配创建”菜单上的“保存”按钮时,它不会将工作分配添加到列表中 作业列表是“课程”数据库中的第二个表(标记为leuntlist.db)。以下是负责处理作业的三个班级 作业清单: public class AssList extends List

我正在(并且已经有一段时间)从事一个android项目,该项目将作为一个非常基本的课程安排应用程序。到目前为止,我做了以下工作:将课程添加到数据库,从数据库中删除课程,在列表中显示位置和主题的课程,打开“作业”菜单为课程创建作业

问题是,当我尝试单击“工作分配创建”菜单上的“保存”按钮时,它不会将工作分配添加到列表中

作业列表是“课程”数据库中的第二个表(标记为leuntlist.db)。以下是负责处理作业的三个班级

作业清单:

public class AssList extends ListActivity {
    public final static String ID_EXTRA = "apt.tutorial._ID";
    Cursor model = null;
    AssAdapter adapter = null;
    AssHelper helper = null;
    SharedPreferences prefs = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ass);

        helper = new AssHelper(this);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        helper.close();
    }

    @Override
    public void onListItemClick(ListView list, View view, int position, long id) {
        Intent i = new Intent(AssList.this, AssForm.class);

        i.putExtra(ID_EXTRA, String.valueOf(id));
        startActivity(i);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        new MenuInflater(this).inflate(R.menu.ass_option, menu);

        return (super.onCreateOptionsMenu(menu));
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.add_ass) {
            startActivity(new Intent(AssList.this, AssForm.class));

            return (true);
        }

        return (super.onOptionsItemSelected(item));
    }

    public void initList() {
        if (model != null) {
            stopManagingCursor(model);
            model.close();
        }

        model = helper.getAll(prefs.getString("sort_order", "name"));
        startManagingCursor(model);
        adapter = new AssAdapter(model);
        setListAdapter(adapter);
    }

    private SharedPreferences.OnSharedPreferenceChangeListener prefListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
        public void onSharedPreferenceChanged(SharedPreferences sharedPrefs,
                String key) {
            if (key.equals("sort_order")) {
                initList();
            }
        }
    };

    class AssAdapter extends CursorAdapter {
        AssAdapter(Cursor c) {
            super(AssList.this, c);
        }

        @Override
        public void bindView(View row, Context ctxt, Cursor c) {
            AssHolder holder = (AssHolder) row.getTag();

            holder.populateFrom(c, helper);
        }

        @Override
        public View newView(Context ctxt, Cursor c, ViewGroup parent) {
            LayoutInflater inflater = getLayoutInflater();
            View row = inflater.inflate(R.layout.row, parent, false);
            AssHolder holder = new AssHolder(row);

            row.setTag(holder);

            return (row);
        }
    }

    static class AssHolder {
        private TextView name = null;
        private TextView address = null;
        private ImageView icon = null;

        AssHolder(View row) {
            name = (TextView) row.findViewById(R.id.title);
            address = (TextView) row.findViewById(R.id.address);
            icon = (ImageView) row.findViewById(R.id.icon);
        }

        void populateFrom(Cursor c, AssHelper helper) {
            name.setText(helper.getName(c));
            address.setText(helper.getUrgency(c));

            if (helper.getUrgency(c).equals("normal")) {
                icon.setImageResource(R.drawable.eg);
            } else if (helper.getUrgency(c).equals("pending")) {
                icon.setImageResource(R.drawable.ey);
            } else {
                icon.setImageResource(R.drawable.er);
            }
        }
    }
}
转让表格:

public class AssForm extends Activity {
    EditText name = null;
    RadioGroup types = null;
    AssHelper helper = null;
    String AssId = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ass_edit);

        helper = new AssHelper(this);

        name = (EditText) findViewById(R.id.assname);
        types = (RadioGroup) findViewById(R.id.urge);

        Button save = (Button) findViewById(R.id.save_ass);
        Button del = (Button) findViewById(R.id.del_ass);
        save.setOnClickListener(onSave);
        del.setOnClickListener(onDel);

        AssId = getIntent().getStringExtra(AssList.ID_EXTRA);

        if (AssId != null) {
            load();
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        helper.close();
    }

    private void load() {
        Cursor c = helper.getById(AssId);

        c.moveToFirst();
        name.setText(helper.getName(c));

        if (helper.getUrgency(c).equals("normal")) {
            types.check(R.id.normal);
        } else if (helper.getUrgency(c).equals("pending")) {
            types.check(R.id.pending);
        } else {
            types.check(R.id.due);
        }

        c.close();
    }

    private View.OnClickListener onSave = new View.OnClickListener() {
        public void onClick(View v) {
            String type = null;

            switch (types.getCheckedRadioButtonId()) {
            case R.id.normal:
                type = "normal";
                break;
            case R.id.pending:
                type = "pending";
                break;
            case R.id.due:
                type = "due";
                break;
            }

            if (AssId == null) {
                helper.insert(name.getText().toString(), type);
            } else {
                helper.update(AssId, name.getText().toString(), type);
            }

            finish();
        }
    };

    private View.OnClickListener onDel = new View.OnClickListener() {
        public void onClick(View v) {
            helper.deleteValue(name.getText().toString());

            finish();
        }
    };
}
工作分配助手:

class AssHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "lunchlist.db";
    private static final int SCHEMA_VERSION = 1;

    public AssHelper(Context context) {
        super(context, DATABASE_NAME, null, SCHEMA_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE assignments (_id INTEGER PRIMARY KEY AUTOINCREMENT, assname TEXT, urge TEXT);");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // no-op, since will not be called until 2nd schema
        // version exists
    }

    public Cursor getAll(String orderBy) {
        return (getReadableDatabase().rawQuery(
                "SELECT _id, assname, urge FROM assignments ORDER BY "
                        + orderBy, null));
    }

    public Cursor getById(String id) {
        String[] args = { id };

        return (getReadableDatabase().rawQuery(
                "SELECT _id, assname, urge FROM assignments WHERE _ID=?",
                args));
    }

    public void insert(String name, String type) {
        ContentValues cv = new ContentValues();

        cv.put("assname", name);
        cv.put("urge", type);

        getWritableDatabase().insert("assignments", "assname", cv);
    }

    public void deleteValue(String value) {
        SQLiteDatabase db = getWritableDatabase();

        String whereClause = "assname" + "=?";
        String[] whereArgs = new String[] { String.valueOf(value) };
        db.delete("assignments", whereClause, whereArgs);
        db.close();
    }

    public void update(String id, String name, String type) {
        ContentValues cv = new ContentValues();
        String[] args = { id };

        cv.put("assname", name);
        cv.put("urge", type);

        getWritableDatabase().update("assignments", cv, "_ID=?", args);
    }

    public String getName(Cursor c) {
        return (c.getString(1));
    }

    public String getUrgency(Cursor c) {
        return (c.getString(2));
    }
}

我知道要通读的东西很多,但是我真的被困在了我项目的最后一部分。这三门课(无论出于何种目的)与增加课程的三门课几乎相同。唯一的区别是变量名被更改,类引用被切换以匹配赋值类。欢迎任何帮助或批评。提前感谢您抽出时间阅读我的问题。

将编辑或条目保存到数据库后,您需要重新加载光标,并在listview上调用
notifydatasetchanged()
,以通知其刷新。由于submit表单和listview处于不同的活动中,并且一个必须位于另一个之上,因此我认为最直接的方法是在列表活动的
OnResume()
方法中执行这些操作,这可能是出于避免无用刷新的有条件意图。更直截了当的是,只需确保listactivity在离开视图时始终处于“完成”状态,以便每次看到它时都是一个新实例,从而重置游标

检查上述内容是否正确的一个好方法是完全关闭应用程序,并查看在应用程序重新启动时是否出现您的编辑或条目


编辑:你的问题让我有点好奇,最终我自己动手运行了完整的代码,自己测试了这个解决方案。真不敢相信我们都错过了,但问题不是没有添加到listview,而是listview根本没有显示。问题是listview从未连接到游标适配器。以下是您所需要的:

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ass);
        helper = new AssHelper(this);        
        loadListview();      
    }   

    private void loadListview() {
        Cursor c = helper.getAll("urge");
        mAdapter = new AssAdapter(c);
        setListAdapter(mAdapter);
    }
我用了一个单独的方法,只需要3行代码,因为您的listview实际上仍然需要在返回活动时刷新。你可能不想这样做,但由于我很懒,我选择了以下方式:

@Override
protected void onResume() {
    super.onResume();
    loadListview();
}

我个人的问题是,游标的第一个实例永远不会被关闭,这在我看来有点不雅观。顺便说一句,这与问题无关,但您的代码使用了很多不推荐的方法(例如,不推荐的游标构造函数,
startManagingCursor
),您可能会或可能不想考虑修改这些部件。完成后还要记得关闭游标和数据库

作为替代方案,您可以将数据库包装在ContentProvider中,然后使用CursorLoader管理光标。CursorLoader在后台线程上运行(耶!),并在其基础数据更改时自动重新加载光标


ContentProvider提供了一点开销,但它隐藏了大量杂乱的数据库内容,否则您必须自己处理这些内容。虽然文档中说您不必使用内容提供商来使用数据库,但内容提供商有时会更好。这样会更好,因为它节省了你的时间。我怀疑大多数应用程序的性能总体上不受使用内容提供商的影响。

当我完全关闭程序时,分配不会出现在列表中。这是否意味着需要不同的解决方案?很抱歉回复太慢,我一直在使用学校的网络,因为我所在的地区断电。我修改了我的帖子,我为错误道歉。非常感谢你的帮助。我很感谢你阅读我的业余代码。当我点击“任务”按钮时,我实际上已经接近了原力。当我注释掉loadListview()时;在onCreate()方法中,强制关闭会停止,但是程序当然会像以前一样运行。11-07 11:04:28.971:E/AndroidRuntime(354):致命异常:main 11-07 11:04:28.971:E/AndroidRuntime(354):java.lang.RuntimeException:无法启动活动组件信息{apt.tutorial/apt.tutorial.AssList}:android.database.sqlite.SQLiteException:没有这样的表:assignments:,编译时:SELECT _id,assname,surge FROM assignments ORDER BY surge似乎在说没有这样的表“assignments”。我有点困惑,正如我在代码中看到的,我在哪里创建了那个表。我将如何以及在哪里实现ContentProvider?我没有这方面的经验。