当前位置: 首页 > 知识库问答 >
问题:

在使用内容值时,是否需要另外编写SELECT查询?

东郭思远
2023-03-14

我正在编写一个代码片段,用于在Android Studio中的Sqlite DB中执行CRUD操作。我创建了一个listView来保存两个属性,即name和job,但应用程序在运行时会崩溃。上面写着:

Sqlite异常:找不到这样的列(代码1)“name”。

我已经搜索了解决方案,但我检查的每一个解决方案都是失败的。我的DB浏览器显示包含该列的表。是否需要将SELECT FROM...Query添加到代码中?如果是的话,那么我应该把代码放在哪里呢?

private static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "SQLiteDatabase.db";
public static final String TABLE_NAME = "USERS";
public static final String _ID = "_id";
public static final String DESC = "occupation";
public static final String SUBJECT = "name";
SQLiteDatabase myDb;

private static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME +
        "(" + _ID  + " INTEGER  PRIMARY KEY AUTOINCREMENT,"
        + SUBJECT + "TEXT NOT NULL,"
        + DESC + "TEXT"+ ")" ;

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

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

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

}

public long insert(String name, String desc) {
     myDb = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(DatabaseHelper.SUBJECT, name);
    contentValues.put(DatabaseHelper.DESC, desc);
    long id = myDb.insert(DatabaseHelper.TABLE_NAME, null, contentValues);
    myDb.close();
    return id;
}

public Cursor read(){
    SQLiteDatabase myDb = this.getWritableDatabase();
    String[] columns = new String[] {DatabaseHelper._ID,DatabaseHelper.SUBJECT,DatabaseHelper.DESC};
    Cursor cursor = myDb.query(DatabaseHelper.TABLE_NAME,columns,null,null,null,null,null);
    if(cursor!=null){
        cursor.moveToFirst();
    }
    myDb.close();
 return cursor;
}

 }
Button addUser;
ArrayList<String> list;
ArrayAdapter<String> adapter;
DatabaseHelper dbManager;


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

    addUser = findViewById(R.id.add_button);
    list = new ArrayList<>();
    adapter = new ArrayAdapter<>(this, R.layout.populate_list, R.id.name, list);
    dbManager = new DatabaseHelper(this);


    addUser.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            addAccount();
        }
    });

}

public void addAccount() {
    Intent intent = new Intent(MainActivity.this, AddUser.class);
    startActivityForResult(intent, 1);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == 1) {
        final String name = intent.getStringExtra("name");
        final String occupation = intent.getStringExtra("occupation");
        ListView listView = findViewById(R.id.parentLayout);

        dbManager.read();
        list.add(name);
        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent i = new Intent(MainActivity.this, UpdateActivity.class);
                i.putExtra(name, "username");
                i.putExtra(occupation, "occupation");
                startActivity(i);

            }
        });
    }
}
}

导入Android.Content.Intent;导入android.support.v7.app.AppCompattivity;导入Android.os.bundle;导入Android.view.view;导入Android.Widget.Button;导入Android.Widget.EditText;

公共类AddUser扩展AppCompattivity{

EditText userName, job;
Button submitButton, cancelButton;

DatabaseHelper dbManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_user);
    dbManager = new DatabaseHelper(this);
    userName = findViewById(R.id.userText);
    job = findViewById(R.id.occupation);
    submitButton = findViewById(R.id.submit_button);
    cancelButton = findViewById(R.id.cancel_button);

    cancelButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(AddUser.this, MainActivity.class);
            startActivity(intent);
        }
    });
    submitButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = getIntent();
            String name = userName.getText().toString();
            String desc = job.getText().toString();
            intent.putExtra(name, "name");
            intent.putExtra(desc, "occupation");
            dbManager.insert(name, desc);
            setResult(1, intent);
            finish();

        }
    });
}

  }

共有1个答案

张森
2023-03-14

您可以尝试使用如下所示的rawquery:

String sql = " SELECT * FROM " + TABLE_NAME + " WHERE " + ONE_COLUMN_NAME + "=?" + " AND " + PERHAPS_ANOTHER_COLUMN + " =?";
    ArrayList<YourKindOfObject> array = new ArrayList<>();
    Cursor cursor = sqLiteDatabase.rawQuery(sql, new String[]{firstParameter, secondParameter});
    while (cursor.moveToNext()) {

        YourKindOfObject yourKindOfObject = new YourKindOfObject();
        yourKindOfObject.setOneThing(cursor.getString(cursor.getColumnIndex(ColumnName));
        yourKindOfObject.setOneOtherThing(cursor.getString(cursor.getColumnIndex(ColumnName1)));
        array.add(yourKindOfObject);
    }
    cursor.close();
    return array;
 类似资料:
  • 问题内容: 如果某些字符串通过管道传递到其STDIN,则我需要一个命令行实用程序来表现不同。这是一些最小的示例: 如果您这样称呼它,效果很好: 如果没有在STDIN上调用任何东西,那么事情就卡在了… …等待。 我需要怎么做才能做到这一点? 提前致谢! 问题答案: 我通过使用os.ModeCharDevice解决了这个问题:

  • 问题内容: 我有一个 Odata 查询: /ecommerceadmin/ODataService.svc/search?$select=status &$filter=id eq'test.com‘和名称eq’abc’ 如何在elasticsearch中实现代码以相应地获取数据。应使用 SearchSourceBuilder 中的 哪种 方法? 问题答案: 您可以轻松地摆脱一个和一个这样的查询:

  • 我使用testAd ID(ca-app-pub-3940256099942544/1033173712)从admob不是我的admob ID,我需要使用addTestDevice()太,而在移动设备测试?它甚至显示了测试广告屏幕,而不是实时广告。 因为我这样做了,我整天都在使用我的应用程序进行测试,晚上我收到了账户暂停邮件。

  • 我正在为我的项目编写Java Avro生产者代码。我已经为所有需要传递的字段注册了Avro模式。 我的注册计划- { “姓名”:“索赔”, “类型”:“记录”, “namespace”:“com.schema.avro”, “字段”:[ ] } 我使用“icn”字段值作为键,但我没有单独注册键模式。我不确定是否需要这样做。 i) 我可以直接使用当前模式中已经存在的字段(本例中为“icn”)作为密钥

  • 我刚刚注意到javadoc状态(强调为我的): 返回声明中包含的此枚举常量的名称。该方法可能被重写,尽管它通常不是必需的或不需要的。当存在更“程序员友好”的字符串窗体时,枚举类型应重写此方法。 默认情况下,和返回相同的内容,因此即使被重写,仍然可以通过方法访问枚举的名称。 编辑:供参考,的javadoc(强调与原文相同): 返回此枚举常量的名称,与在其枚举声明中声明的名称完全相同。大多数程序员应该

  • 帮助这个的正确答案是什么??USE fruit后面没有分号。所以我想是A。 但是为什么要指定他们想要的数据库呢? 如果是你,你会选择什么? 编写一个查询,在水果数据库中创建一个名为prices的表。 A)创建表价格(项目VARCHAR(50),价格浮动); B)使用水果创建表价格(项目VARCHAR(50),价格浮动); C)使用水果插入表价格(项目VARCHAR(50),价格浮动); 啊,对不起