PDA

View Full Version : کار با دیتابیس طراحی شده در SQLite Expert Professional



mohitlog
سه شنبه 29 اردیبهشت 1394, 13:02 عصر
باسلام

من دیتابیسم رو با SQLite Expert Professional طراحی کردم. ولی از طریق برنامم(اندروید) نمی دونم چجوری باید به این دیتابیسم کانکت بشم و کارامو انجام بدم.


اگر کسی میتونه سریع کمک کنه یا نمونه کدی بده تا بتونم ازش الگو گیرم و کارمو انجام بدم

با تشکر

JYasProgramer
سه شنبه 29 اردیبهشت 1394, 16:05 عصر
ببین دوست من در حقیقت شما باید اونو در sd card قرار بدی و اونو در data بریزی و هنگامی که کپی شد کارتو انجام بدی اینم کدش

public class DataBaseHelper extends SQLiteOpenHelper {

public static String DB_PATH = "";
private static String DB_NAME = "myDBName";
private Context myContext;
private SQLiteDatabase myDataBase;
private String TAG = "DataBaseHelper";

public static boolean databaseExist;

public DataBaseHelper(Context context){
super(context, DB_NAME, null, 1);
if(android.os.Build.VERSION.SDK_INT >= 4.2){
DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
} else {
DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
}
this.myContext = context;
}

public void createDataBase() throws IOException
{
//If database not exists copy it from the assets

boolean mDataBaseExist = checkDataBase();
if(!mDataBaseExist)
{
this.getReadableDatabase();
this.close();
try
{
//Copy the database from assests
Log.i("Databasehelper class", "start create database");
copyDataBase();
Log.i(TAG, "createDatabase database created");
}
catch (IOException mIOException)
{
throw new Error("ErrorCopyingDataBase");
}
}
}

private boolean checkDataBase(){
File dbFile = new File(DB_PATH + DB_NAME);
return dbFile.exists();
}

private void copyDataBase() throws IOException
{
File file = new File(Environment.getExternalStorageDirectory() + "/myDBName");
if(file.exists()){
Log.i("Databasehelper Class", "in copyDataBase() method");
databaseExist = true;
InputStream mInput = new FileInputStream(file);
String outFileName = DB_PATH + DB_NAME;
File f = new File(outFileName);
f.mkdir();
OutputStream mOutput = new FileOutputStream(f);
byte[] mBuffer = new byte[1024];
int mLength;
while ((mLength = mInput.read(mBuffer))>0)
{
mOutput.write(mBuffer, 0, mLength);
}
mOutput.flush();
mOutput.close();
mInput.close();
Log.i("Databasehelper Class", "End of copyDataBase() method");
}else{
databaseExist = false;
}
}

public void openDataBase()throws SQLException{
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
Log.i("in DataBaseHelper in openDataBase method", "after opening database");
}

@Override
public synchronized void close() {
// TODO Auto-generated method stub
if(myDataBase != null)
myDataBase.close();
super.close();
}

@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
}

@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
}

سوالی بود بپرس

mohitlog
چهارشنبه 30 اردیبهشت 1394, 17:01 عصر
سلام مجدد

زحمت کشیدی ولی این اصلا برام قابل فهم نیست. میتونی بیشتر توضیح بدی>؟
کوئریمو کجا بنویسم؟
؟میتونی یک نمونه مثال بدی؟

با تشکر

JYasProgramer
چهارشنبه 30 اردیبهشت 1394, 17:56 عصر
ببین دوست من شما یه کلاس دیگه ای ایجاد کن برای نوشتن کوری
در کلاس های دلخواه (مثلا MainActivity) ابتدا اول باید یه شی از DatabaseHandler میسازی به کمک اون شی متد createDataBase رو فراخونی کنی تا کپی رو انجام بده و پس از کپی کردن می بایست دیتابیس رو open کنی که با متد openDataBase و هنگامی که خواستی خارج از کلاست متد close رو فراخونی میکنی، در ضمن پس از کپی کردن باید یک شی از کلاس مورد نظرت رو که یه کوری اجرا می کنه رو فراخونی کنی و بعد یا در انتهای متد close رو
مثلا
کلاس comments

public int _ID;
public int state;
public byte[] object;

public Comments(int _ID, int state, byte[] object) {
this._ID = _ID;
this.state = state;
this.object = object;
}

public Comments() {

}

public void setId(int _ID) {
this._ID = _ID;
}
public int getId() {
return _ID;
}

public void setState(int state) {
this.state = state;
}
public int getState() {
return state;
}

public void setObject(byte[] object) {
this.object = object;
}
public byte[] getObject() {
return object;
}

کلاس databaseHnadler


public void addContact(Comments c) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("state", c.state);
cv.put("object", c.object);

db.insert("contacts", null, cv);
db.close();
}




MainClass


private DatabaseHandler dbHandler;

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

dbHandler = new DatabaseHandler(getApplicationContext());
dbHandler.addContact(new Comments(1, 1, objectArray));
}

موفق باشی

JYasProgramer
چهارشنبه 30 اردیبهشت 1394, 18:04 عصر
ببین دوست من شما یه کلاس دیگه ای ایجاد کن برای نوشتن کوری
در کلاس های دلخواه (مثلا MainActivity) ابتدا اول باید یه شی از DatabaseHandler میسازی به کمک اون شی متد createDataBase رو فراخونی کنی تا کپی رو انجام بده و پس از کپی کردن می بایست دیتابیس رو open کنی که با متد openDataBase و هنگامی که خواستی خارج از کلاست متد close رو فراخونی میکنی، در ضمن پس از کپی کردن باید یک شی از کلاس مورد نظرت رو که یه کوری اجرا می کنه رو فراخونی کنی و بعد یا در انتهای متد close رو
مثلا دیتا بیس من دوتا ستون داره یکی state و object
کلاس comments

public int _ID;
public int state;
public byte[] object;

public Comments(int _ID, int state, byte[] object) {
this._ID = _ID;
this.state = state;
this.object = object;
}

public Comments() {

}

public void setId(int _ID) {
this._ID = _ID;
}
public int getId() {
return _ID;
}

public void setState(int state) {
this.state = state;
}
public int getState() {
return state;
}

public void setObject(byte[] object) {
this.object = object;
}
public byte[] getObject() {
return object;
}

کلاس databaseHnadler


public void addContact(Comments c) {

ContentValues cv = new ContentValues();
cv.put("state", c.state);
cv.put("object", c.object);

db.insert("contacts", null, cv);

}




MainClass


private DatabaseHandler dbHandler;
private DatabaseHelper dbHelper;

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

dbHelper = new DatabaseHelper(this);
dbHelper.crreateDatabase();
dbHelper.openDatabase();

dbHandler = new DatabaseHandler(getApplicationContext());
dbHandler.addContact(new Comments(1, 1, objectArray));

dbHelper.close();
}

موفق باشی

mohitlog
چهارشنبه 30 اردیبهشت 1394, 18:08 عصر
سلام

یک اتیویتی لاگین دارم که توش کاربر با ورود اطلاعاتش وارد صفحه بعدش بشه


public void testPreLoadedSQLiteDb() {




DatabaseAdapter db = new DatabaseAdapter(this);




// run only once... ?


// copy assets DB to app DB.


try {


db.create();


} catch (IOException ioe) {


throw new Error("Unable to create database");


}






// get all locations


TextView txt=(TextView)findViewById(R.id.txt);


String buffer = "";




db.open();


List<Users> locations = db.getLocations();




for(int n=0;n<locations.size();n++) {


String lat = locations.get(n).username;


String lng = locations.get(n).password;


String name = locations.get(n).familyname;




buffer = buffer + name + " (" + lat + "," + lng + ")\n";


System.out.println("REG:"+n+" "+ name + " (" + lat + "," + lng + ")");


}


txt.setText(buffer);




}







یک کلاس اداپتر دارم




import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;


import java.io.*;
import java.util.LinkedList;
import java.util.List;


public class DatabaseAdapter extends SQLiteOpenHelper {


public static String DB_PATH = "";
private static String DB_NAME = "Mabar";
private static String TABLE_Users = "Users";
private Context myContext;
private SQLiteDatabase myDataBase;
private String TAG = "DataBaseHelper";


public static boolean databaseExist;
private SQLiteDatabase db;
// constructor
public DatabaseAdapter(Context context) {


super( context , DB_NAME , null , 1);
if(android.os.Build.VERSION.SDK_INT >= 4.2){
DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
} else {
DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
}
this.myContext = context;
}






// Creates a empty database on the system and rewrites it with your own database.
public void create() throws IOException{


//If database not exists copy it from the assets


boolean mDataBaseExist = checkDataBase();
if(!mDataBaseExist)
{
this.getReadableDatabase();
this.close();
try
{
//Copy the database from assests
Log.i("Databasehelper class", "start create database");
copyDataBase();
Log.i(TAG, "createDatabase database created");
}
catch (IOException mIOException)
{
throw new Error("ErrorCopyingDataBase");
}
}
}


// Check if the database exist to avoid re-copy the data
private boolean checkDataBase(){
File dbFile = new File(DB_PATH + DB_NAME);
return dbFile.exists();


}


// copy your assets db to the new system DB
private void copyDataBase() throws IOException{


File file = new File(Environment.getExternalStorageDirectory() + "/myDBName");
if(file.exists()){
Log.i("Databasehelper Class", "in copyDataBase() method");
databaseExist = true;
InputStream mInput = new FileInputStream(file);
String outFileName = DB_PATH + DB_NAME;
File f = new File(outFileName);
f.mkdir();
OutputStream mOutput = new FileOutputStream(f);
byte[] mBuffer = new byte[1024];
int mLength;
while ((mLength = mInput.read(mBuffer))>0)
{
mOutput.write(mBuffer, 0, mLength);
}
mOutput.flush();
mOutput.close();
mInput.close();
Log.i("Databasehelper Class", "End of copyDataBase() method");
}else{
databaseExist = false;
}
}


//Open the database
public void open() {
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
Log.i("in DataBaseHelper in openDataBase method", "after opening database");


}


@Override
public synchronized void close() {


if(db != null)
if(android.os.Build.VERSION.SDK_INT>=14){
db.close();
}


super.close();


}


@Override
public void onCreate(SQLiteDatabase db) {


}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {


}




//
// PUBLIC METHODS TO ACCESS DB CONTENT
//




// Get locations
public List<Users> getLocations() {


List<Users> usersList = null;


try {


String query = "SELECT * FROM " + TABLE_Users;
SQLiteDatabase db = SQLiteDatabase.openDatabase( DB_PATH + DB_NAME , null, SQLiteDatabase.OPEN_READWRITE);
Cursor cursor = db.rawQuery(query, null);


// go over each row, build elements and add it to list
usersList = new LinkedList<Users>();


if (cursor.moveToFirst()) {
do {


Users users = new Users();
users.familyname = cursor.getString(1);
users.password = cursor.getString(2);
users.username =cursor.getString(3);


usersList.add(users);


} while (cursor.moveToNext());
}
} catch(Exception e) {
//Toast.makeText( "Unable to create datagetLocationsbase", Toast.LENGTH_LONG).show();
// sql error
throw new Error("sql error");
}


return usersList;
}
}



یک کلاس یوزر هم دارم


public class Users {
public String familyname,username,password;


public Users(){}


@Override
public String toString() {
return "familyname is=["+familyname+"] and username = "+ username+" and password= "+ password +"]";
}
}



ولی وقتی برنامه اجرا میشه stop میشه

با تشکر

JYasProgramer
چهارشنبه 30 اردیبهشت 1394, 18:50 عصر
package com.matthieu;

public class TEXT {
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;


import java.io.*;
import java.util.LinkedList;
import java.util.List;


public class DatabaseAdapter extends SQLiteOpenHelper {


public static String DB_PATH = "";
private static String DB_NAME = "Mabar";
private static String TABLE_Users = "Users";
private Context myContext;
private SQLiteDatabase myDataBase;
private String TAG = "DataBaseHelper";


public static boolean databaseExist;
private SQLiteDatabase db;
// constructor
public DatabaseAdapter(Context context) {


super( context , DB_NAME , null , 1);
if(android.os.Build.VERSION.SDK_INT >= 4.2){
DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
} else {
DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
}
this.myContext = context;
}






// Creates a empty database on the system and rewrites it with your own database.
public void create() throws IOException{


//If database not exists copy it from the assets


boolean mDataBaseExist = checkDataBase();
if(!mDataBaseExist)
{
this.getReadableDatabase();
this.close();
try
{
//Copy the database from assests
Log.i("Databasehelper class", "start create database");
copyDataBase();
Log.i(TAG, "createDatabase database created");
}
catch (IOException mIOException)
{
throw new Error("ErrorCopyingDataBase");
}
}
}


// Check if the database exist to avoid re-copy the data
private boolean checkDataBase(){
File dbFile = new File(DB_PATH + DB_NAME);
return dbFile.exists();


}


// copy your assets db to the new system DB
private void copyDataBase() throws IOException{


File file = new File(Environment.getExternalStorageDirectory() + "/myDBName");
if(file.exists()){
Log.i("Databasehelper Class", "in copyDataBase() method");
databaseExist = true;
InputStream mInput = new FileInputStream(file);
String outFileName = DB_PATH + DB_NAME;
File f = new File(outFileName);
f.mkdir();
OutputStream mOutput = new FileOutputStream(f);
byte[] mBuffer = new byte[1024];
int mLength;
while ((mLength = mInput.read(mBuffer))>0)
{
mOutput.write(mBuffer, 0, mLength);
}
mOutput.flush();
mOutput.close();
mInput.close();
Log.i("Databasehelper Class", "End of copyDataBase() method");
}else{
databaseExist = false;
}
}


//Open the database
public void open() {
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
Log.i("in DataBaseHelper in openDataBase method", "after opening database");


}


@Override
public synchronized void close() {


if(db != null)
if(android.os.Build.VERSION.SDK_INT>=14){
db.close();
}


super.close();


}


@Override
public void onCreate(SQLiteDatabase db) {


}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {


}




//
// PUBLIC METHODS TO ACCESS DB CONTENT
//




// Get locations
public List<Users> getLocations() {


List<Users> usersList = null;


try {

open();
String query = "SELECT * FROM " + TABLE_Users;
Cursor cursor = db.rawQuery(query, null);


// go over each row, build elements and add it to list
usersList = new LinkedList<Users>();


if (cursor.moveToFirst()) {
do {


Users users = new Users();
users.familyname = cursor.getString(0);
users.password = cursor.getString(1);
users.username =cursor.getString(2);


usersList.add(users);


} while (cursor.moveToNext());
}
} catch(Exception e) {
//Toast.makeText( "Unable to create datagetLocationsbase", Toast.LENGTH_LONG).show();
// sql error
throw new Error("sql error");
}

close();

return usersList;
}
}
}




متن ارورشو بفرست

mohitlog
جمعه 01 خرداد 1394, 12:37 عصر
سلام

1- کدی که من نوشته بودم درست بود؟
2- میتونی کدهای سلکت، اینزرت، اپدیت و دلیت روبرام بنویسی؟
3- کدی که شما برای addCommnet نوشتی کویری insert کجاست؟


خطایی که میده اینه



Read access is allowed from event dispatch thread or inside read-action only (see com.intellij.openapi.application.Application.runRe adAction())
Details: Current thread: Thread[ApplicationImpl pooled thread 7,4,Idea Thread Group] 17982322
Our dispatch thread:Thread[AWT-EventQueue-1 0.1#AI-130.677228, eap:true,6,Idea Thread Group] 5446954
SystemEventQueueThread: Thread[AWT-EventQueue-1 0.1#AI-130.677228, eap:true,6,Idea Thread Group] 5446954
1:19:19 PM Session 'City-City': error
1:19:22 PM Throwable
Read access is allowed from event dispatch thread or inside read-action only (see com.intellij.openapi.application.Application.runRe adAction())
Details: Current thread: Thread[ApplicationImpl pooled thread 20,4,Idea Thread Group] 22183414
Our dispatch thread:Thread[AWT-EventQueue-1 0.1#AI-130.677228, eap:true,6,Idea Thread Group] 5446954
SystemEventQueueThread: Thread[AWT-EventQueue-1 0.1#AI-130.677228, eap:true,6,Idea Thread Group] 5446954

JYasProgramer
شنبه 02 خرداد 1394, 10:33 صبح
این ارور مربوط به دیتابیس نیست دوست من
داری روی لاگین لاگ اوت در آندروید کار میکنی؟

mohitlog
شنبه 02 خرداد 1394, 18:43 عصر
سلام

میتونی زحمت بکشی یک نمونه کد با اندروید استودیو برام بنویسی که با دیتابیس کار کنه و 4 کویری رو انجام بده.

اینطوری فک کنم زود تر به نتیجه برسم

با تشکر

omid_cr77
شنبه 02 خرداد 1394, 20:29 عصر
سلاممیتونی زحمت بکشی یک نمونه کد با اندروید استودیو برام بنویسی که با دیتابیس کار کنه و 4 کویری رو انجام بده.اینطوری فک کنم زود تر به نتیجه برسمبا تشکرمن می تونم برات انجام بدم.تو میغام خصوصی پیام بده اگه خواستی

omid_cr77
شنبه 02 خرداد 1394, 20:55 عصر
سلام

میتونی زحمت بکشی یک نمونه کد با اندروید استودیو برام بنویسی که با دیتابیس کار کنه و 4 کویری رو انجام بده.
اینطوری فک کنم زود تر به نتیجه برسم

با تشکر

من می تونم برات انجام بدم.تو میغام خصوصی پیام بده اگه خواستی

JYasProgramer
یک شنبه 03 خرداد 1394, 05:07 صبح
این یه لینک مناسب با آموزش جامع
http://www.kamalan.com/1391/04/%D9%81%DB%8C%D9%84%D9%85-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%DB%8C-%D9%81%D8%B5%D9%84-%D9%86%D9%87%D9%85-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3/