ورود

View Full Version : مشکل با کار با دیتابیس



parniaznet
جمعه 15 اسفند 1393, 16:25 عصر
سلام
من تازه کار با دیتابیس رو دارم یاد میگیرم ، یک دیتابیس برای تمرین ساختم که در تصویر زیر میتونید ببینید :
http://up.vbiran.ir/uploads/32326142564931814565_Captureaaa.PNG

کلاس دیتابیسم و متدهام رو با این کد ها تعریف کردم :

package com.example.testesdatabase;

import android.database.sqlite.SQLiteOpenHelper;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

public class database extends SQLiteOpenHelper {

public final String path = "data/data/com.example.testesdatabase/databases/";
public final String Name = "database";
public SQLiteDatabase mydb;
private final Context mycontext;


public database(Context context) {
super(context, "database", null, 1);
mycontext = context;
}


@Override
public void onCreate(SQLiteDatabase arg0) {

}


@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {

}

public void useable() {
boolean checkdb = checkdb();
if (checkdb) {

} else {
this.getReadableDatabase();
try {
copydatabase();
}
catch (IOException e) {

}
}
}

public void open() {
mydb = SQLiteDatabase.openDatabase(path + Name, null, SQLiteDatabase.OPEN_READWRITE);
}

@Override
public void close() {
mydb.close();
}


public boolean checkdb() {
SQLiteDatabase db = null;
try {
db = SQLiteDatabase.openDatabase(path + Name, null, SQLiteDatabase.OPEN_READONLY);
}
catch (SQLException e) {

}
return db != null ? true : false;
}

public void copydatabase() throws IOException {

OutputStream myOutput = new FileOutputStream(path + Name);
byte[] buffer = new byte[1024];
int lenght;
InputStream myInput = mycontext.getAssets().open(Name);
while ((lenght = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, lenght);
}
myInput.close();
myOutput.flush();
myOutput.close();
}

public String namayesh(int row , int field , String table){

android.database.Cursor Cursor = mydb.rawQuery("SELECT * FROM "+table , null);
Cursor.moveToPosition(row);
String str = Cursor.getString(field);
return str;
}

public Integer shomaresh_field(String table,String field){
Cursor Cursor = mydb.rawQuery("SELECT * FROM "+table+" group by "+field, null);
int i = Cursor.getCount();
return i ;
}

public String namayesh_fasl(String table , int row){
Cursor Cursor = mydb.rawQuery("SELECT * FROM "+table+" group by dastebandi", null);
Cursor.moveToPosition(row);
String s = Cursor.getString(1);
return s ;
}

public Integer shomaresh_dastan (String table , String dastebandi){
Cursor Cursor = mydb.rawQuery("SELECT * FROM "+table+" where dastebandi='"+dastebandi+"' group by name", null);
int s = Cursor.getCount();
return s;

}

}

در اکتیویتی اصلی یک دکمه قرار دادم که وقتی روش کلیک میشه بره به اکتیویتی دسته بندی ها و یک لیست ویو از دسته بندی ها رو به من نشون بده.
کد های اکتیویتی دسته بندی هام رو هم بدین صورت تعریف کردم :
package com.example.testesdatabase;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class Dastebandiha extends ListActivity{

private database db;
private String[] Name;
private String[] Teedad;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dastebandiha);
db = new database(this);


refresher();
setListAdapter(new AA());

}
class AA extends ArrayAdapter<String>{

public AA(){
super(Dastebandiha.this,R.layout.raw_dastebandiha, Name);

}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater in = getLayoutInflater();
View row = in.inflate(R.layout.raw_dastebandiha, parent,false);

TextView name = (TextView) row.findViewById(R.id.name_season);
TextView teedad = (TextView) row.findViewById(R.id.teedad_dastan);

name.setText(Name [position]);
teedad.setText(Teedad [position]);

return (row);
}

}

private void refresher(){
db.open();
int save = db.shomaresh_field("testesajad", "dastebandi");
Name = new String[save];
Teedad = new String[save];

for (int i = 0; i <save; i++) {
Name[i] = db.namayesh_fasl("testesajad", i);
Teedad[i] = db.shomaresh_dastan("testesajad", Name[i].toString())+"";
}
db.close();
}
}
یک فایل xml هم ساختم که دوتا تکست ویو توش قرار دادم برای نحوه نمایش لیست ویو با اسم raw_dastebandiha

وقتی برنامه رو اجرا می کنم ، وقتی روی دکمه کلیک میکنم که بره به اکتیویتی بعدی ، فورس کلوز میده.
این کدهایی که من نوشتم کجاش مشکل داره که باعث این ارور میشه؟

ممنون میشم راهنمایی کنید

tux-world
شنبه 16 اسفند 1393, 00:31 صبح
فورس کلوز دادن مهم نیست برنامه کرش بکنه این پیغام رو میده لاگ کت برنامتون رو بزارید اینجا بخونیم ببینیم مشکل چیه.

parniaznet
شنبه 16 اسفند 1393, 22:39 عصر
فورس کلوز دادن مهم نیست برنامه کرش بکنه این پیغام رو میده لاگ کت برنامتون رو بزارید اینجا بخونیم ببینیم مشکل چیه.

اینم لاگ کت :


03-07 23:22:37.985: E/SQLiteLog(25802): (1) no such column: name
03-07 23:22:37.992: E/AndroidRuntime(25802): FATAL EXCEPTION: main
03-07 23:22:37.992: E/AndroidRuntime(25802): Process: com.example.testesdatabase, PID: 25802
03-07 23:22:37.992: E/AndroidRuntime(25802): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testesdatabase/com.example.testesdatabase.Dastebandiha}: android.database.sqlite.SQLiteException: no such column: name (code 1): , while compiling: SELECT * FROM testesajad where dastebandi='جوک جد?د' group by name
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2377)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.app.ActivityThread.handleLaunchActivity(Ac tivityThread.java:2429)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.app.ActivityThread.access$800(ActivityThre ad.java:151)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.app.ActivityThread$H.handleMessage(Activit yThread.java:1342)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.os.Handler.dispatchMessage(Handler.java:11 0)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.os.Looper.loop(Looper.java:193)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.app.ActivityThread.main(ActivityThread.jav a:5333)
03-07 23:22:37.992: E/AndroidRuntime(25802): at java.lang.reflect.Method.invokeNative(Native Method)
03-07 23:22:37.992: E/AndroidRuntime(25802): at java.lang.reflect.Method.invoke(Method.java:515)
03-07 23:22:37.992: E/AndroidRuntime(25802): at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:829)
03-07 23:22:37.992: E/AndroidRuntime(25802): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:645)
03-07 23:22:37.992: E/AndroidRuntime(25802): at dalvik.system.NativeStart.main(Native Method)
03-07 23:22:37.992: E/AndroidRuntime(25802): Caused by: android.database.sqlite.SQLiteException: no such column: name (code 1): , while compiling: SELECT * FROM testesajad where dastebandi='جوک جد?د' group by name
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.database.sqlite.SQLiteConnection.nativePre pareStatement(Native Method)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.database.sqlite.SQLiteConnection.acquirePr eparedStatement(SQLiteConnection.java:893)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.database.sqlite.SQLiteConnection.prepare(S QLiteConnection.java:504)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.database.sqlite.SQLiteSession.prepare(SQLi teSession.java:588)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.database.sqlite.SQLiteDirectCursorDriver.q uery(SQLiteDirectCursorDriver.java:44)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.database.sqlite.SQLiteDatabase.rawQueryWit hFactory(SQLiteDatabase.java:1339)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.database.sqlite.SQLiteDatabase.rawQuery(SQ LiteDatabase.java:1278)
03-07 23:22:37.992: E/AndroidRuntime(25802): at com.example.testesdatabase.database.shomaresh_dast an(database.java:122)
03-07 23:22:37.992: E/AndroidRuntime(25802): at com.example.testesdatabase.Dastebandiha.refresher( Dastebandiha.java:58)
03-07 23:22:37.992: E/AndroidRuntime(25802): at com.example.testesdatabase.Dastebandiha.onCreate(D astebandiha.java:24)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.app.Activity.performCreate(Activity.java:5 343)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.app.Instrumentation.callActivityOnCreate(I nstrumentation.java:1088)
03-07 23:22:37.992: E/AndroidRuntime(25802): at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2331)
03-07 23:22:37.992: E/AndroidRuntime(25802): ... 11 more

parniaznet
یک شنبه 17 اسفند 1393, 17:07 عصر
یعنی یک نفر نیست بگه مشکل این کد چیه؟!! دو روز گذشته!

gilas1368
دوشنبه 18 اسفند 1393, 07:41 صبح
no such column: name
خطاتون اینه و این ینی شما ستونی به اسم name ندارید اما میخواید اطلاعاتش رو بیرون بکشید

golbafan
دوشنبه 18 اسفند 1393, 07:53 صبح
نباید از اسامی ای که برای دیتابیس معنادار محسوب میشن ، برای نامگزاری فیلدها استفاده کنید:

مثلا: name / order / date و غیره...

اگر حتما میخواهید اینجوری نام گزاری کنید بهتره از یک کاراکتر دیگه هم استفاده بشه . مثلا: name1

gilas1368
دوشنبه 18 اسفند 1393, 09:11 صبح
نباید از اسامی ای که برای دیتابیس معنادار محسوب میشن ، برای نامگزاری فیلدها استفاده کنید:

مثلا: name / order / date و غیره...

اگر حتما میخواهید اینجوری نام گزاری کنید بهتره از یک کاراکتر دیگه هم استفاده بشه . مثلا: name1

دوست خوبم این روشی که شما دارید پیشنهاد میدید بدترین روش نامگذاری فیلدهاست
حرفتون درسته که نباید از اسامی معنا دار برای پایگاه داده در نامگذاری فیلدها استفاده بشه
اما اگ در زمان تعریف فیلد اون نام رو (مثلا Order ک برای پایگاه معنا دار هستش) به این صورت [Order] بنویسید مشکلی بوجود نمیاد و پایگاه میفهمه که از کلمه ینی Order همون نام فیلد شماست

golbafan
دوشنبه 18 اسفند 1393, 17:51 عصر
دوست خوبم این روشی که شما دارید پیشنهاد میدید بدترین روش نامگذاری فیلدهاست
حرفتون درسته که نباید از اسامی معنا دار برای پایگاه داده در نامگذاری فیلدها استفاده بشه
اما اگ در زمان تعریف فیلد اون نام رو (مثلا Order ک برای پایگاه معنا دار هستش) به این صورت [Order] بنویسید مشکلی بوجود نمیاد و پایگاه میفهمه که از کلمه ینی Order همون نام فیلد شماست

سلام
بنده متوجه هستم...

اما مشکل ایشون رو جواب دادم که اینجوری کوئری زده:
("SELECT * FROM "+table+" where dastebandi='"+dastebandi+"' group by name", null)

parniaznet
سه شنبه 19 اسفند 1393, 11:31 صبح
سلام
بنده متوجه هستم...

اما مشکل ایشون رو جواب دادم که اینجوری کوئری زده:
("SELECT * FROM "+table+" where dastebandi='"+dastebandi+"' group by name", null)

من کوئری رو به کوئری زیر هم تغییر دادم بازم فرقی نکرد فورس کلوز میده هنوز

("SELECT * FROM "+table+" where dastebandi='"+dastebandi+"' group by dastebandi", null)