2017-10-12 57 views
-1

如何连接(?)查询的字符串?或%s像PHP ...我知道用+做出来,但并非如此! 我需要查询更改PHP的字符串值使用?或%S(Android中Java的相似)......在项目中的所有模型声明变量后的Android Java查询字符串动态值

package yyy.yyy.yyy.yyy.actions; 

import android.content.Context; 

import yyy.yyy.yyy.yyy.models.CategoriesModel; 

public class CategoriesActions extends CategoriesModel { 
    protected String sqlInsert = "INSERT INTO categories (title) VALUES (?) "; 
    protected String sqlUpdate = "UPDATE categories SET title=? WHERE id=?"; 
    protected String sqlDelete = "UPDATE FROM categories WHERE id=?"; 
    protected String sqlSelect = "SELECT %s FROM categories %s %s %s"; // ? or %s 

    public CategoriesActions(Context context) { 
     super(context); 
    } 

    public boolean insert() 
    { 
     String cat_title = this.getTitle(); 
     String sql = sqlInsert; // <---------- need concatenate cat_title in sqlInser (?) 

     //return sql; 
     return this.RunQuery(sql); 
    } 

    public String update() 
    { 
     String sql = ""; 
     return sql; 
    } 

    public String delete() 
    { 
     String sql = ""; 
     return sql; 
    } 

    public String select(String columns, String where, String order, String limit) 
    { 
     String sql = ""; 
     return sql; 
    } 
} 

的DbConnection层(项目所有型号扩展此类(通用))

package yyy.yyy.yyy.yyy.database; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class dbConnection extends SQLiteOpenHelper { 
    private SQLiteDatabase conn; 

    public static final String DATABASE_NAME="App.Xitano"; 
    private static final int DATABASE_VERSION = 1; 

    private static final String TABLE_CATEGORIES = "categories"; 
    private static final String TABLE_PAYMENT_TYPES = "payment_types"; 
    private static final String TABLE_TRANSACTIONS = "transactions"; 

    private static final String CATEGORIES_KEY_ID = "id"; 
    private static final String CATEGORIES_KEY_TITLE = "title"; 
    private static final String CATEGORIES_KEY_CREATED_AT = "created_at"; 
    private static final String CATEGORIES_KEY_UPDATED_AT = "updated_at"; 

    private static final String PAYMENT_TYPES_KEY_ID = "id"; 
    private static final String PAYMENT_TYPES_KEY_TITLE = "title"; 
    private static final String PAYMENT_TYPES_KEY_CREATED_AT = "created_at"; 
    private static final String PAYMENT_TYPES_KEY_UPDATED_AT = "updated_at"; 

    private static final String TRANSACTIONS_KEY_ID = "id"; 
    private static final String TRANSACTIONS_KEY_IN_OUT = "in_out"; 
    private static final String TRANSACTIONS_KEY_CATEGORIES_ID = "categories_id"; 
    private static final String TRANSACTIONS_KEY_PAYMENT_TYPES_ID = "payment_types_id"; 
    private static final String TRANSACTIONS_KEY_TITLE = "title"; 
    private static final String TRANSACTIONS_KEY_AMOUNT = "amount"; 
    private static final String CTRANSACTIONS_KEY_CREATED_AT = "created_at"; 
    private static final String TRANSACTIONS_KEY_UPDATED_AT = "updated_at"; 

    private static final String CREATE_TABLE_CATEGORIES = "CREATE TABLE " + TABLE_PAYMENT_TYPES + "(" 
      + PAYMENT_TYPES_KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 
      + PAYMENT_TYPES_KEY_TITLE + " TEXT," 
      + PAYMENT_TYPES_KEY_CREATED_AT + "TIMESTAMP," 
      + PAYMENT_TYPES_KEY_UPDATED_AT + "TIMESTAMP);"; 

    private static final String CREATE_TABLE_PAYMENT_TYPES = "CREATE TABLE " + TABLE_CATEGORIES + "(" 
      + CATEGORIES_KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 
      + CATEGORIES_KEY_TITLE + " TEXT," 
      + CATEGORIES_KEY_CREATED_AT + "TIMESTAMP," 
      + CATEGORIES_KEY_UPDATED_AT + "TIMESTAMP);"; 

    public dbConnection(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     Log.d("table", TABLE_CATEGORIES); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     /* 
     db.execSQL(CREATE_TABLE_STUDENTS); 
     db.execSQL(CREATE_TABLE_USER_HOBBY); 
     db.execSQL(CREATE_TABLE_USER_CITY); 
     */ 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     /* 
     db.execSQL("DROP TABLE IF EXISTS '" + TABLE_USER + "'"); 
     db.execSQL("DROP TABLE IF EXISTS '" + TABLE_USER_HOBBY + "'"); 
     db.execSQL("DROP TABLE IF EXISTS '" + TABLE_USER_CITY + "'"); 
     onCreate(db); 
     */ 
    } 

    public SQLiteDatabase ConnectWritable(){ 
     this.conn = this.getWritableDatabase(); 
     return this.conn; 
    } 

    public SQLiteDatabase ConnectReadable(){ 
     this.conn = this.getReadableDatabase(); 
     return this.conn; 
    } 

    public boolean RunQuery(String sql){ 
     SQLiteDatabase stm = this.ConnectWritable(); 
     stm.execSQL(sql); 
     return true; 
    } 

    public Cursor RunSelect(String sql){ 
     SQLiteDatabase stm = this.ConnectReadable(); 
     Cursor cursor = stm.rawQuery(sql, null); 
     return cursor; 
    } 

    public int RunCount(String sql){ 
     SQLiteDatabase stm = this.ConnectReadable(); 
     Cursor cursor = stm.rawQuery(sql, null); 
     cursor.moveToFirst(); 
     if (cursor.getCount() > 0 && cursor.getColumnCount() > 0) { 
      cursor.close(); 
      return cursor.getInt(0); 
     } else { 
      cursor.close(); 
      return 0; 
     } 
    } 

    public void Disconnect(){ 
     this.conn.close(); 
     this.conn = null; 
    } 
} 

模型层(延伸的DbConnection级(一般)

package yyy.yyy.yyy.yyy.models; 

import android.content.Context; 

import yyy.yyy.yyy.yyy.database.dbConnection; 

import java.io.Serializable; 

public class CategoriesModel extends dbConnection implements Serializable { 
    private int id; 
    private String title; 

    public CategoriesModel(Context context) { 
     super(context); 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public int getId() { 
     return id; 
    } 

    public String getTitle() { 
     return title; 
    } 
} 

谢谢!

+0

建议您在Google准备好的语句! – bated

+0

我不相信准备的声明是好的或在这一层工作! –

+0

我更新并在这篇文章中插入图层... 任何人有任何想法,使这项工作在图层? ty –

回答

-1

解决:

protected String sqlInsert = "INSERT INTO categories (title) VALUES (%s) "; 
public boolean insert() 
{ 
    String sql = String.format(sqlInsert, this.getTitle()); 
    return this.RunQuery(sql); 
} 

谢谢啦!

+1

我建议你阅读这个https://stackoverflow.com/questions/2099425/when-should-we-use-a-preparedstatement-instead-of-a-statement] – bated

0

你提到准备语句“这层不好”,但挑战为什么准备好的陈述不适合你?例如,在你的代码中有:

protected String sqlInsert = "INSERT INTO categories (title) VALUES (?) "; 

您可以轻松创建一个事先准备好的声明:

PreparedStatement pstmt = con.prepareStatement(sqlInsert); 

然后,所有你需要做的就是通过相关参数,使用集的查询()方法可用于准备报表。更多信息请点击here

+0

是的。我做到了..但是我需要在我的层次上实现良好的实践!在我的图层中,我需要prepareStatement变量,它只能在dbConnection层中使用! –

+0

我需要知道我如何prepareStatement(类似)在行动层...一个类似的功能绑定变量sql ...我使它在另一个代码中的dbConnection,但它是一个不好的做法... –