PDA

View Full Version : مشکل با sqlite



smemamian
پنج شنبه 14 آذر 1392, 17:24 عصر
سلام دوستان

من طبق این مثال :

http://up.clip2ni.com/download/1358/CustomDataList_CodeProject.zip.html

مثال زیر رو نوشتم ولی نمی دونم چرا اجرا نمیشه !!

http://up.clip2ni.com/download/1359/ex13.zip.html
ممنون می شوم کسی اشکالم رو بهم بگه

reza_azizi2010
پنج شنبه 14 آذر 1392, 23:42 عصر
اگه لطف کن ارروری که میده رو بنویسی بهتره، اینجوری دوستان باید دوتا برنامه رو دانلود و نصب کنن که خب خیلی وقت گیره

smemamian
جمعه 15 آذر 1392, 11:25 صبح
این کلاس MyDB.java :

package com.example.ex13;

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

public class MyDB {

private final Context contx ;
private SQLiteDatabase sqllite ;
private DbHelper dbhelper ;

private static final String DB_NAME = "mydb";
public static final String ID = "id";
public static final String TITLE = "title";
public static final String PRICE = "price";
public static final String DESCRIPTION = "dec";
private static final String CREATE_DB = "CREATE TABLE "

+DB_NAME+" ("+ ID +" INTEGER PRIMARY KEY AUTOINCREMENT, "+
TITLE + " TEXT, "+
PRICE + " INTEGER DEFAULT 0, " +
DESCRIPTION + " TEXT" + ");";



private static final String DATA1 =
"INSERT INTO "+DB_NAME+" ("+
TITLE+","+
PRICE+","+
DESCRIPTION+") VALUES (" +
"'One',"+
"10,"+
"'It is one'"+");";


private static final String DATA2 =
"INSERT INTO "+DB_NAME+" ("+
TITLE+","+
PRICE+","+
DESCRIPTION+") VALUES (" +
"'Two',"+
"20,"+
"'It is two'"+");";


private static final String DATA3 =
"INSERT INTO "+DB_NAME+" ("+
TITLE+","+
PRICE+","+
DESCRIPTION+") VALUES (" +
"'Three',"+
"30,"+
"'It is Three'"+");";


public MyDB(Context cont){
this.contx = cont ;
}

public MyDB open() throws SQLException {
Log.e("tag", "open()");
dbhelper = new DbHelper(contx);
sqllite = dbhelper.getWritableDatabase();
return this ;
}

public void closedb(){

dbhelper.close();
}

public Cursor fetchListitems(){
Log.e("tag", "fetchlistitems");
Cursor cursor ;

cursor = sqllite.query(DB_NAME, new String[]
{ID,TITLE,PRICE,DESCRIPTION},null,null,null,null,n ull);
if(cursor != null)
cursor.moveToFirst();
Log.e("tag", "returnfetchlistitems");
return cursor ;

}


private static class DbHelper extends SQLiteOpenHelper {

public DbHelper(Context context) {
super(context, DB_NAME, null, 1);
// TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(CREATE_DB);
db.execSQL(DATA1);
db.execSQL(DATA2);
db.execSQL(DATA3);
Log.e("tag", "db created");

}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
if ( newVersion > oldVersion){

db.execSQL("DROP TABLE IF EXISTS " + DB_NAME);
onCreate(db);
}else
onCreate(db);
}



}

}

این کلاس MainActivity :

package com.example.ex13;

import android.R.string;
import android.os.Bundle;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.database.Cursor;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.ResourceCursorAdapter;
import android.widget.TextView;

public class MainActivity extends ListActivity {
static final String tag = "tag" ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(tag, "create");

MyDB mydb = new MyDB(this);
mydb.open();
Log.e(tag, "open");
Cursor mycurser = mydb.fetchListitems();
Log.e(tag, "mycurser");
startManagingCursor(mycurser);
Log.e(tag, "startManagingCurser");
setListAdapter(new MyListAdapter(this,mycurser));
Log.e(tag, "setlistadapter");
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

class MyListAdapter extends ResourceCursorAdapter{

public MyListAdapter(Context context, Cursor c) {
//Log.e(tag, "beforcreateMylistadapter");
super(context, R.layout.items_layout,c );
// TODO Auto-generated constructor stub
Log.e(tag, "createMylistadapter");
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
// TODO Auto-generated method stub
Log.e(tag, "bindview1");
TextView text1 = (TextView)view.findViewById(R.id.txt1);
text1.setText(cursor.getString(cursor.getColumnInd ex(MyDB.TITLE)));
TextView text2 = (TextView)view.findViewById(R.id.txt2);
text2.setText(cursor.getString(cursor.getColumnInd ex(MyDB.DESCRIPTION)));
Log.e(tag, "bindview2");
}


}

}



این activity_main.xml :

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
</LinearLayout>

این items_layout.xml :


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight">

<RelativeLayout
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:duplicateParentState="true">

<TextView
android:id="@+id/txt1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
android:text="Test"
/>
<TextView
android:id="@+id/txt2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@id/txt1"
android:textAppearance="?android:attr/textAppearanceSmall"
android:singleLine="true"
android:text="Test"
/>
</RelativeLayout>
</LinearLayout>


این هم خطا ها :


12-06 08:34:06.151: E/Trace(772): error opening trace file: No such file or directory (2)
12-06 08:34:06.781: E/tag(772): create
12-06 08:34:06.781: E/tag(772): open()
12-06 08:34:06.851: E/tag(772): open
12-06 08:34:06.851: E/tag(772): fetchlistitems
12-06 08:34:06.861: E/tag(772): returnfetchlistitems
12-06 08:34:06.861: E/tag(772): mycurser
12-06 08:34:06.861: E/tag(772): startManagingCurser
12-06 08:34:06.891: E/AndroidRuntime(772): FATAL EXCEPTION: main
12-06 08:34:06.891: E/AndroidRuntime(772): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ex13/com.example.ex13.MainActivity}: java.lang.IllegalArgumentException: column '_id' does not exist
12-06 08:34:06.891: E/AndroidRuntime(772): at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2180)
12-06 08:34:06.891: E/AndroidRuntime(772): at android.app.ActivityThread.handleLaunchActivity(Ac tivityThread.java:2230)
12-06 08:34:06.891: E/AndroidRuntime(772): at android.app.ActivityThread.access$600(ActivityThre ad.java:141)
12-06 08:34:06.891: E/AndroidRuntime(772): at android.app.ActivityThread$H.handleMessage(Activit yThread.java:1234)
12-06 08:34:06.891: E/AndroidRuntime(772): at android.os.Handler.dispatchMessage(Handler.java:99 )
12-06 08:34:06.891: E/AndroidRuntime(772): at android.os.Looper.loop(Looper.java:137)
12-06 08:34:06.891: E/AndroidRuntime(772): at android.app.ActivityThread.main(ActivityThread.jav a:5039)
12-06 08:34:06.891: E/AndroidRuntime(772): at java.lang.reflect.Method.invokeNative(Native Method)
12-06 08:34:06.891: E/AndroidRuntime(772): at java.lang.reflect.Method.invoke(Method.java:511)
12-06 08:34:06.891: E/AndroidRuntime(772): at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:793)
12-06 08:34:06.891: E/AndroidRuntime(772): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:560)
12-06 08:34:06.891: E/AndroidRuntime(772): at dalvik.system.NativeStart.main(Native Method)
12-06 08:34:06.891: E/AndroidRuntime(772): Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
12-06 08:34:06.891: E/AndroidRuntime(772): at android.database.AbstractCursor.getColumnIndexOrTh row(AbstractCursor.java:303)
12-06 08:34:06.891: E/AndroidRuntime(772): at android.widget.CursorAdapter.init(CursorAdapter.ja va:168)
12-06 08:34:06.891: E/AndroidRuntime(772): at android.widget.CursorAdapter.<init>(CursorAdapter.java:116)
12-06 08:34:06.891: E/AndroidRuntime(772): at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:52)
12-06 08:34:06.891: E/AndroidRuntime(772): at com.example.ex13.MainActivity$MyListAdapter.<init>(MainActivity.java:45)
12-06 08:34:06.891: E/AndroidRuntime(772): at com.example.ex13.MainActivity.onCreate(MainActivit y.java:30)
12-06 08:34:06.891: E/AndroidRuntime(772): at android.app.Activity.performCreate(Activity.java:5 104)
12-06 08:34:06.891: E/AndroidRuntime(772): at android.app.Instrumentation.callActivityOnCreate(I nstrumentation.java:1080)
12-06 08:34:06.891: E/AndroidRuntime(772): at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2144)
12-06 08:34:06.891: E/AndroidRuntime(772): ... 11 more

reza_azizi2010
جمعه 15 آذر 1392, 11:52 صبح
کدی که نوشتی یکم شلوغه، کاری که من میکنم اینجوریه :
اول مسیر اس دی کارت رو بدست میار :
String SDCARD_dir = Environment.getExternalStorageDirectory().getAbsol utePath();


بعدش یک پوشه درست میکنی که دیتابیس اونجا ساخته بشه
new File(SDCARD_dir+"/masir/").mkdirs();
بعدش خود دیتابیس رو ایجاد میکنی :
database = SQLiteDatabase.openOrCreateDatabase(DATABASE_DIR +"/masir/" +"/esme_database", null);
بعدش یه اشاره گر به دیتابیس میسازی :
database = SQLiteDatabase.openOrCreateDatabase(DATABASE_DIR +"/masir/+ "/esme_database", null);
تا اینجا وقتی اجرا میشه باید یک پوشه با اسمی که نوشتی توی اس دی کارت ایجاد شده باشه و توش یه دیتابیس هم ساخته بشه
حالا توش باید یک table بسازی
بقیه اش با دستورات sql کار داره :
database.execSQL("CREATE TABLE IF NOT EXIST esme_table va tarife fildha.... " );