2017-10-12 85 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,但它是一個不好的做法... –